现有ASP.NET MVC与API项目集成Azure AD认证的方案咨询
整体技术选型
直接用微软官方提供的Microsoft.Identity.Web类库实现即可,这套库封装了Azure AD OAuth2.0/OpenID Connect的全流程逻辑,不需要手写token签发、校验、跳转的底层代码,完全兼容现有带Startup类的ASP.NET项目,可以和你原有的用户名密码登录逻辑并存,不需要重构现有认证体系。
端到端登录流程
整体链路不需要改动原有账号密码的处理逻辑,新增的Azure登录流程走如下链路:
- 前端MVC登录页新增「通过Azure登录」按钮,用户点击后跳转到Azure AD授权页面
- 用户在Azure AD页面完成账号校验、授权后,Azure AD将授权码回传到MVC站点提前配置的回调地址
- MVC站点用授权码换取id token和访问API用的access token,后续调用API时将access token放在请求的Authorization头中
- API侧校验access token合法性,提取token中携带的用户属性(邮箱、姓名、租户ID等),和本地用户库完成匹配后,走和原有账号密码登录完全一致的会话创建逻辑即可
现有API项目(含Startup类)配置步骤
重点注意不要删除原有账号密码对应的认证配置,只需要增量添加Azure AD认证能力即可:
- 先给API项目安装Nuget包,在包管理控制台执行:
Install-Package Microsoft.Identity.Web - 修改Startup类的ConfigureServices方法,在原有AddAuthentication的逻辑上增量添加Azure AD的token校验配置,示例代码如下:
public void ConfigureServices(IServiceCollection services) { // 原有服务注册(比如AddControllers、DbContext、业务依赖注入等)全部保留不动 services.AddAuthentication() // 原有自定义JWT认证(账号密码登录用),你之前写的校验配置全部保留不动 .AddJwtBearer("LocalJwt", options => { // 原有JWT校验参数,比如IssuerSigningKey、ValidIssuer、ValidAudience等不需要修改 }) // 新增Azure AD颁发的JWT token校验逻辑 .AddMicrosoftIdentityWebApi(Configuration.GetSection("AzureAd"), "AzureAdJwt"); // 配置授权策略,同时支持本地账号密码的JWT凭证、Azure AD颁发的token访问接口 services.AddAuthorization(options => { options.DefaultPolicy = new AuthorizationPolicyBuilder( "LocalJwt", "AzureAdJwt") .RequireAuthenticatedUser() .Build(); }); } - 检查Startup类Configure方法中的中间件顺序,确保
app.UseAuthentication()在app.UseAuthorization()之前即可,如果你原来已经配置了这两个中间件,不需要重复添加,保持原有顺序就行:public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 原有异常处理、静态文件、路由等中间件保持不变 app.UseRouting(); // 确认两个认证授权中间件的顺序,认证在前、授权在后 app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); } - 在appsettings.json配置文件中添加AzureAD节点,填入你在Azure AD中注册API应用拿到的对应参数:
"AzureAd": { "Instance": "https://login.microsoftonline.com/", "Domain": "你的Azure AD租户默认域名", "TenantId": "你的Azure AD租户ID", "ClientId": "API应用对应的Azure AD应用注册ID", "Scopes": "你为API暴露的访问权限范围" }
前端MVC侧配套注意点
- 单独为MVC前端在Azure AD中注册一个应用,配置登录回调地址为MVC站点的
/signin-oidc路径,同时给这个应用授予访问API的权限 - MVC侧同样安装
Microsoft.Identity.Web包,配置OpenID Connect认证逻辑,点击Azure登录按钮时触发认证挑战跳转到Azure AD授权页 - MVC拿到Azure AD返回的access token后,后续调用API时按照
Bearer <token内容>的格式放到请求头里即可 - 如果需要支持首次用Azure登录的用户自动注册,只需要在API校验token通过后,查询本地用户库如果不存在对应用户,就根据token携带的用户属性自动创建本地账号即可,后续业务逻辑不需要改动
注意:原有用户名密码登录的逻辑完全不需要改动,两种登录方式可以并行提供给用户选择
内容的提问来源于stack exchange,提问作者Psychonaut007
相关产品推荐
相关产品推荐

