如何验证 Azure AD 访问的 appid

Posted

技术标签:

【中文标题】如何验证 Azure AD 访问的 appid【英文标题】:How to Validate appid of the Azure AD Access 【发布时间】:2021-02-17 00:15:18 【问题描述】:

我们有一个执行 JWT 令牌身份验证的 .NET Core 应用程序。此应用程序在 Azure AD 中注册,客户端 ID 为 abcde,API 范围为 api://abcde。我们的租户注册了其他应用程序,其中一个的客户端 ID 为fghij。我注意到的是,如果我将这个客户端 ID 与它的秘密和 API 范围 api://abcde 一起使用,我就能够生成一个访问令牌并访问这个范围下的 API。

services.AddAuthentication(options =>

    options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
)
.AddJwtBearer(options =>

    options.Authority = $" Configuration.GetValue<string>("AzureAD:Instance") / Configuration.GetValue<string>("AzureAD:TenantId") /";
    options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
    
        ValidAudience = Configuration.GetValue<string>("AzureAD:Audience"),
        ValidIssuer = $"https://sts.windows.net/ Configuration.GetValue<string>("AzureAD:TenantId") "
    ;
);

我想到的解决方案是验证访问令牌中的 appid 字段。我怎样才能做到这一点?基本上我想确保只有客户端 ID abcde 可以请求范围 api://abcde 的访问令牌。

"aio": "abcde=",
"appid": "abcde", //client id of the application in Azure AD
"appidacr": "1",

【问题讨论】:

我知道这个迟到的响应,您可以构建自定义身份验证处理程序并验证令牌,referbruv.com/blog/posts/… 【参考方案1】:

可以先获取ClaimsPrincipal再使用

ClaimsPrincipal.Current.FindFirst("appid").Value

获取appid字段的值。然后判断该值是否等于你指定的app id。

【讨论】:

我应该在哪里使用它?在OnTokenValidating 事件中?【参考方案2】:

您可以更改默认授权策略以验证 appid 声明。 开箱即用,默认策略是:

new AuthorizationPolicyBuilder()
    .RequireAuthenticatedUser()
    .Build();

你可以改成:

    builder.Services.AddAuthorization(options =>
    
        options.DefaultPolicy = new AuthorizationPolicyBuilder()
            .RequireAuthenticatedUser()
            .RequireClaim("appid", "allowedApp1", "allowedApp2")
            .Build();
    );

请参考Setting global authorization policies using the DefaultPolicy and the FallbackPolicy in ASP.NET Core 3.x

【讨论】:

不能在OnTokenValidating事件中验证这一点吗?

以上是关于如何验证 Azure AD 访问的 appid的主要内容,如果未能解决你的问题,请参考以下文章

当用户的 AD 身份验证失败时如何导航到自定义访问被拒绝页面(.net 3.1 核心与 OpenIDConnect Azure AD 身份验证)

通过 Azure AD 验证不透明的访问令牌

Blazor 使用 Azure AD 身份验证允许匿名访问

[Azure - Security] Azure的多重身份验证:使用AD(Azure Active Directory)开启用户MFA

Azure Front Door、应用服务访问限制和 AD 身份验证

如何配置 Azure AD 访问令牌的过期时间(使用 ADAL)?