如何验证 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 - Security] Azure的多重身份验证:使用AD(Azure Active Directory)开启用户MFA