微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将应用注册客户端 ID 放入 Azure AD 令牌?

如何解决如何将应用注册客户端 ID 放入 Azure AD 令牌?

我有一个 ASP.NET Core API,我想在其中使用 Azure AD 身份验证。 我已经创建了一个应用注册并为我的 API 提供了以下配置:

 "AzureAd": {
    "TenantId": "<tenantid>","ClientId": "api://<clientid>",// tried it with only the guid clientid as well
  },

身份验证配置(提供应用注册公开 API 范围):

services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            }).AddJwtBearer(JwtBearerDefaults.AuthenticationScheme,options =>
            {
                options.RequireHttpsMetadata = false;
                options.Audience = Configuration["AzureAd:ClientId"];
                options.Authority = "https://login.microsoftonline.com/" + Configuration["AzureAd:TenantId"];
            })

我的问题是,当我登录到 azure AD 时,我的令牌中的受众将是 00000002-0000-0000-c000-000000000000(AAD Graph API 的 ID),而不是应用程序注册的客户端 ID。

我正在使用 swagger 来测试身份验证:

        app.UseSwaggerUi3(config =>
        {
            config.oauth2client = new NSwag.AspNetCore.oauth2clientSettings
            {
                ClientId = Configuration["AzureAd:ClientId"],ClientSecret = string.Empty,UsePkceWithAuthorizationCodeGrant = true,ScopeSeparator = " "
            };
        });

swagger 文档配置:

services
    .AddOpenApiDocument(c =>
    {
        c.AddSecurity("OAuth2",new OpenApiSecurityScheme
        {
            OpenIdConnectUrl = $"https://login.microsoftonline.com/common/v2.0/.well-kNown/openid-configuration",Scheme = "Bearer",Type = OpenApiSecuritySchemeType.OAuth2,Flows = new OpenApiOAuthFlows
            {
                AuthorizationCode = new OpenApiOAuthFlow
                {
                    AuthorizationUrl = $"https://login.microsoftonline.com/{Configuration["AzureAd:TenantId"]}/oauth2/authorize",TokenUrl = $"https://login.microsoftonline.com/{Configuration["AzureAd:TenantId"]}/oauth2/token",Scopes = new Dictionary<string,string>
                    {
                        { "api://<client id>/Api.Read","api://<client id>/Api.Read" }
                    }
                }
            }
        });
    })

解决方法

在评论中讨论后,找到了可行的解决方案:

  1. 在公开 API 页面中定义 API 应用注册的范围
  2. 在 Swagger UI 中使用范围,例如:api://client-id/Api.Read
  3. 使用 v2.0 令牌和授权端点:
AuthorizationUrl = $"https://login.microsoftonline.com/{Configuration["AzureAd:TenantId"]}/oauth2/v2.0/authorize",TokenUrl = $"https://login.microsoftonline.com/{Configuration["AzureAd:TenantId"]}/oauth2/v2.0/token",Scopes = new Dictionary<string,string>
{
    { "api://<client id>/Api.Read","api://<client id>/Api.Read" }
}
,

根据 documentation,请求者的客户端 ID 包含在 appid(v1 令牌)或 azp(v2 令牌)声明中。您观察到的行为是正确的,因为受众是预期验证令牌并提供对所需资源的访问的一方的 ID。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?