如何解决如何将应用注册客户端 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" }
}
}
}
});
})
解决方法
在评论中讨论后,找到了可行的解决方案:
- 在公开 API 页面中定义 API 应用注册的范围
- 在 Swagger UI 中使用范围,例如:api://client-id/Api.Read
- 使用 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 举报,一经查实,本站将立刻删除。