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

使用微软身份平台的ASP.NET Core Web应用如何获取JWT令牌

问题原因
  • 默认OpenID Connect授权流程仅请求了身份凭证(id_token),未指定需要返回访问令牌(access_token)和刷新令牌(refresh_token),就算开启了SaveTokens也没有可保存的令牌内容
  • 未声明offline_access权限,微软身份平台默认不会返回refresh_token
  • 未指定需要访问的资源对应的scope,身份平台无法签发对应资源的access_token
解决步骤
  1. 调整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");
    });
  1. 检查AzureAD应用注册配置
  • 进入Azure Portal的应用注册界面,找到当前Web应用对应的注册项
  • 在「API权限」菜单中,添加自研服务对应的API权限,若为组织内部使用建议授予管理员同意
  • 确认「身份验证」菜单中的重定向URI配置正确,支持授权码流
  1. 验证获取令牌的代码
    GetTokenAsync方法可以直接省略认证方案参数(默认会使用你配置的默认方案),修改后的Razor页面代码参考:
<p>Access Token: @await HttpContext.GetTokenAsync("access_token")</p>
<p>Refresh Token: @await HttpContext.GetTokenAsync("refresh_token")</p>
  1. 清除浏览器现有Cookie,重新触发登录流程,确保用新的授权参数发起认证请求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 20:57:01