You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在MAUI Windows桌面应用中实现.NET AD/ADFS认证?求代码示例

MAUI Windows 桌面应用对接 Active Directory/ADFS 认证方案

当然有可行的实现方案,针对中小公司的低成本需求,以下是适配MAUI Windows环境的具体实现方式:

一、对接.NET Active Directory(Windows集成认证)

Blazor Server的AuthenticationStateProvider依赖ASP.NET Core服务端认证体系,无法直接在MAUI桌面环境复用,但可以通过Windows原生API或.NET AD管理类库实现域用户认证:

1. 直接获取当前域用户信息

使用System.DirectoryServices.AccountManagement命名空间快速获取登录用户:

using System.DirectoryServices.AccountManagement;

// 获取当前登录的域用户
using (var domainContext = new PrincipalContext(ContextType.Domain))
{
    var currentUser = UserPrincipal.Current;
    if (currentUser != null)
    {
        string userId = currentUser.SamAccountName; // 短用户名格式:domain\user
        string upn = currentUser.UserPrincipalName; // 用户主体名格式:user@domain.com
        
        // 可选:验证用户是否属于指定AD组
        bool isInAuthorizedGroup = currentUser.IsMemberOf(domainContext, IdentityType.Name, "YourAllowedADGroup");
    }
}

这种方式适用于域内运行的应用,无需额外登录界面,完全贴合低成本需求。

2. 适配Blazor组件的认证上下文

如果想在MAUI Blazor组件中沿用类似Blazor Server的AuthenticationStateProvider用法,可以自定义实现:

using Microsoft.AspNetCore.Components.Authorization;
using System.Security.Claims;
using System.DirectoryServices.AccountManagement;

public class AdAuthStateProvider : AuthenticationStateProvider
{
    public override Task<AuthenticationState> GetAuthenticationStateAsync()
    {
        ClaimsIdentity identity = new();
        using (var domainContext = new PrincipalContext(ContextType.Domain))
        {
            var adUser = UserPrincipal.Current;
            if (adUser != null)
            {
                var claims = new List<Claim>
                {
                    new(ClaimTypes.Name, adUser.SamAccountName),
                    new(ClaimTypes.UserPrincipalName, adUser.UserPrincipalName)
                };
                // 可按需添加更多AD属性作为Claim,如部门、邮箱等
                identity = new ClaimsIdentity(claims, "WindowsADAuth");
            }
        }
        var userPrincipal = new ClaimsPrincipal(identity);
        return Task.FromResult(new AuthenticationState(userPrincipal));
    }
}

在MauiProgram.cs中注册这个自定义Provider:

builder.Services.AddScoped<AuthenticationStateProvider, AdAuthStateProvider>();

之后就能在Blazor组件中像Blazor Server那样调用AuthenticationStateProvider获取用户信息。

二、对接ADFS认证

如果需要跨域访问或更标准化的认证流程,ADFS可通过OAuth2/OIDC协议对接,使用MSAL库实现:

using Microsoft.Identity.Client;

// 初始化MSAL客户端
var pca = PublicClientApplicationBuilder
    .Create("YourADFSClientId")
    .WithAuthority("https://your-adfs-server/adfs")
    .WithRedirectUri("msalYourADFSClientId://auth") // MAUI Windows专属重定向URI格式
    .Build();

// 尝试静默获取令牌,失败则触发交互式登录
var existingAccounts = await pca.GetAccountsAsync();
AuthenticationResult authResult;
try
{
    authResult = await pca.AcquireTokenSilent(new[] { "your-protected-api-scope" }, existingAccounts.FirstOrDefault())
        .ExecuteAsync();
}
catch (MsalUiRequiredException)
{
    authResult = await pca.AcquireTokenInteractive(new[] { "your-protected-api-scope" })
        .ExecuteAsync();
}

// 获取用户信息及访问令牌
string userId = authResult.Account.Username;
string accessToken = authResult.AccessToken; // 用于调用ADFS保护的API

同样可以将authResult中的用户信息注入自定义AuthenticationStateProvider,保持Blazor组件的认证逻辑一致性。

注意事项

MAUI Blazor桌面应用与Blazor Server同属可信桌面环境,安全需求更偏向企业内部认证集成,以上方案均适配这类场景,无需额外复杂的安全配置,符合中小公司的预算与需求。

内容的提问来源于stack exchange,提问作者Craig

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 13:55:17