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

.NET 7 Blazor MAUI Azure企业账号认证及非B2C社交登录咨询

解决方案:Blazor MAUI 集成微软工作账号认证及替代登录选项

一、连接Azure AD应用注册(微软工作账号登录)

你需要使用MSAL.NET(Microsoft Authentication Library)完成Azure AD认证逻辑,替换当前MauiProgram.cs中占位的注释部分,具体步骤如下:

1. 安装依赖NuGet包

Install-Package Microsoft.Identity.Client
Install-Package Microsoft.AspNetCore.Components.Authorization

2. 配置Azure AD应用信息

在项目的appsettings.json中添加认证配置:

{
  "AzureAd": {
    "ClientId": "你的Azure应用注册ClientId",
    "TenantId": "组织专属租户ID(仅允许内部用户登录时使用;若要支持所有微软工作账号,可设为common)",
    "RedirectUri": "msal{你的ClientId}://auth"
  }
}

提示:上述RedirectUri必须在Azure应用注册后台的「移动和桌面应用」平台中提前配置

3. 完善MauiProgram.cs的认证逻辑

替换原有占位代码,完整的认证初始化部分如下:

builder.Services.AddAuthorizationCore();
builder.Services.TryAddScoped<AuthenticationStateProvider, ExternalAuthStateProvider>();
builder.Services.AddSingleton<AuthenticatedUser>();

// 注册MSAL客户端
builder.Services.AddSingleton(sp =>
{
    var config = sp.GetRequiredService<IConfiguration>();
    var azureAdSection = config.GetSection("AzureAd");
    
    return PublicClientApplicationBuilder
        .Create(azureAdSection["ClientId"])
        .WithTenantId(azureAdSection["TenantId"])
        .WithRedirectUri(azureAdSection["RedirectUri"])
        .Build();
});

var host = builder.Build();

var authenticatedUser = host.Services.GetRequiredService<AuthenticatedUser>();
var msalClient = host.Services.GetRequiredService<IPublicClientApplication>();

// 优先获取缓存的登录用户,无缓存则弹出登录界面
AuthenticationResult authResult;
var existingAccounts = await msalClient.GetAccountsAsync();
try
{
    // 请求微软Graph基础权限,可根据业务需求扩展
    authResult = await msalClient.AcquireTokenSilent(new[] { "User.Read" }, existingAccounts.FirstOrDefault())
        .ExecuteAsync();
}
catch (MsalUiRequiredException)
{
    // 无缓存用户,触发原生登录界面
    authResult = await msalClient.AcquireTokenInteractive(new[] { "User.Read" })
        .ExecuteAsync();
}

// 将MSAL返回的用户信息转换为ClaimsPrincipal注入到认证体系
var claimsIdentity = new ClaimsIdentity(authResult.Claims, "AzureAD");
authenticatedUser.Principal = new ClaimsPrincipal(claimsIdentity);

return host;

4. 优化ExternalAuthStateProvider支持状态更新

当前实现的认证状态是静态的,登录/登出后无法通知Blazor组件更新,需扩展如下:

using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Components.Authorization;

public class ExternalAuthStateProvider : AuthenticationStateProvider
{
    private readonly AuthenticatedUser _authenticatedUser;

    public ExternalAuthStateProvider(AuthenticatedUser authenticatedUser)
    {
        _authenticatedUser = authenticatedUser;
    }

    public override Task<AuthenticationState> GetAuthenticationStateAsync()
    {
        return Task.FromResult(new AuthenticationState(_authenticatedUser.Principal));
    }

    // 新增方法:用于登录/登出后更新认证状态并通知组件
    public void UpdateAuthState(ClaimsPrincipal newPrincipal)
    {
        _authenticatedUser.Principal = newPrincipal;
        NotifyAuthenticationStateChanged(GetAuthenticationStateAsync());
    }
}

public class AuthenticatedUser
{
    public ClaimsPrincipal Principal { get; set; } = new();
}

二、不依赖Azure AD B2C的其他登录选项

若无法使用Azure AD B2C,可直接集成以下身份提供商,核心逻辑均为:发起授权请求→获取Token→拉取用户信息→构建ClaimsPrincipal→注入认证体系:

  • 通用微软账号登录:将Azure AD配置中的TenantId设为common,即可同时支持微软个人账号和所有组织的工作账号,无需B2C。
  • Google登录:使用Google.Apis.Auth库完成OAuth2授权,解析返回的用户信息生成ClaimsPrincipal。
  • Facebook登录:通过Facebook官方SDK获取用户授权信息,转换为ClaimsPrincipal后注入认证状态。
  • 自定义OAuth2提供商:只要目标提供商支持OAuth2/OpenID Connect协议,均可按照相同流程实现集成。

关键注意事项

  • 移动端的回调地址(RedirectUri)必须在身份提供商后台提前配置,否则会出现授权回调失败。
  • Blazor MAUI的认证界面由原生SDK弹出,而非Blazor页面,这是混合应用的原生交互特性。
  • 登出逻辑:调用MSAL的RemoveAsync方法移除登录账户,再调用ExternalAuthStateProvider.UpdateAuthState将状态更新为匿名用户。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 11:52:44