如何在Web客户端+.NET Core API 6.0架构中实现Azure AD用户认证?
你的Azure AD认证流程是正确的,以下是关键细节与实现建议
你的认证思路完全符合Azure AD针对前后端分离应用的标准认证模式,核心流程是Web客户端通过Azure AD获取访问令牌(Access Token),再将令牌附在API请求的Authorization头中,由.NET Core API验证令牌有效性,这是OAuth2.0/OpenID Connect规范下的推荐实践。
关键细节补充
- 不要让Web客户端直接收集用户凭据:应该使用授权码流程(Authorization Code Flow),引导用户跳转到Azure AD官方登录页面完成身份验证,避免客户端处理/存储用户密码,极大提升安全性。
- 区分ID Token与Access Token:客户端需获取Access Token(用于调用API),ID Token仅用于客户端自身验证用户身份信息(如用户名、租户ID),不能用来调用API。
.NET Core API 6.0 令牌验证实现
在API的Program.cs中配置Azure AD认证:
var builder = WebApplication.CreateBuilder(args); // 注册Azure AD认证服务 builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd")); // 添加授权服务 builder.Services.AddAuthorization(); var app = builder.Build(); // 启用认证与授权中间件 app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); app.Run();
在appsettings.json中配置Azure AD参数:
"AzureAd": { "Instance": "https://login.microsoftonline.com/", "TenantId": "你的Azure AD租户ID", "ClientId": "API应用注册的客户端ID" }
Web客户端令牌获取建议
使用MSAL.js(Microsoft Authentication Library for JavaScript)实现授权码流程,示例代码:
// 初始化MSAL实例 const msalConfig = { auth: { clientId: "Web客户端应用注册的ID", authority: "https://login.microsoftonline.com/你的租户ID", redirectUri: "Web客户端的回调地址(需在应用注册中配置)" } }; const msalInstance = new msal.PublicClientApplication(msalConfig); // 登录并获取访问令牌 async function getAccessToken() { // 弹出登录窗口 const loginResult = await msalInstance.loginPopup({ scopes: ["api://你的API客户端ID/access_as_user"] // API定义的权限范围 }); // 静默获取令牌(避免重复登录) const tokenResult = await msalInstance.acquireTokenSilent({ scopes: ["api://你的API客户端ID/access_as_user"], account: loginResult.account }); return tokenResult.accessToken; } // 调用API时携带令牌 async function callApi() { const token = await getAccessToken(); const response = await fetch("你的API端点", { method: "GET", headers: { "Authorization": `Bearer ${token}` } }); const data = await response.json(); }
额外注意事项
- 确保API的应用注册中已定义权限范围,且Web客户端的应用注册中已添加该权限并完成管理员授权(若需要)。
- API会自动验证令牌的签名、受众(aud)、过期时间(exp)等核心属性,无需手动编写验证逻辑,由Microsoft Identity Web库处理。
- 在API控制器中,可通过
HttpContext.User获取当前用户的身份信息(如User.FindFirst(ClaimTypes.NameIdentifier)?.Value获取用户ID)。
内容的提问来源于stack exchange,提问作者aka baka
相关产品推荐
相关产品推荐

