使用微软身份平台的ASP.NET Core Web应用如何获取JWT令牌
问题原因
- 默认OpenID Connect授权流程仅请求了身份凭证(id_token),未指定需要返回访问令牌(access_token)和刷新令牌(refresh_token),就算开启了
SaveTokens也没有可保存的令牌内容 - 未声明
offline_access权限,微软身份平台默认不会返回refresh_token - 未指定需要访问的资源对应的scope,身份平台无法签发对应资源的access_token
解决步骤
- 调整Program.cs中的身份验证配置,修改OpenID Connect参数,示例修改后的代码如下:
builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(options => { builder.Configuration.Bind("AzureAd", options); options.SaveTokens = true; // 指定响应类型同时返回授权码和id_token,用于后续交换access_token options.ResponseType = OpenIdConnectResponseType.CodeIdToken; // 添加基础scope options.Scope.Add("openid"); options.Scope.Add("profile"); // 要获取refresh_token必须添加该scope options.Scope.Add("offline_access"); // 替换为你自研服务对应的scope,即你在AzureAD中注册自研服务时暴露的API scope options.Scope.Add("api://<你自研服务的客户端ID>/<权限名称>"); // 如果需要调用微软GraphAPI,可添加对应scope,例如: // options.Scope.Add("User.Read"); });
- 检查AzureAD应用注册配置
- 进入Azure Portal的应用注册界面,找到当前Web应用对应的注册项
- 在「API权限」菜单中,添加自研服务对应的API权限,若为组织内部使用建议授予管理员同意
- 确认「身份验证」菜单中的重定向URI配置正确,支持授权码流
- 验证获取令牌的代码
GetTokenAsync方法可以直接省略认证方案参数(默认会使用你配置的默认方案),修改后的Razor页面代码参考:
<p>Access Token: @await HttpContext.GetTokenAsync("access_token")</p> <p>Refresh Token: @await HttpContext.GetTokenAsync("refresh_token")</p>
- 清除浏览器现有Cookie,重新触发登录流程,确保用新的授权参数发起认证请求。
内容的提问来源于stack exchange,提问作者Jonny
相关产品推荐
相关产品推荐

