我们有一个执行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字段。我怎样才能做到这一点?基本上,我想确保只有客户端IDabcde
可以请求作用域的访问令牌api://abcde
。
"aio": "abcde=",
"appid": "abcde", //client id of the application in Azure AD
"appidacr": "1",
你可以更改默认的授权策略以验证appid声明。开箱即用的默认策略是:
new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
你可以将其更改为:
builder.Services.AddAuthorization(options =>
{
options.DefaultPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.RequireClaim("appid", "allowedApp1", "allowedApp2")
.Build();
});
请参阅参考以在ASP.NET Core 3.x中使用DefaultPolicy和FallbackPolicy设置全局授权策略。
在
OnTokenValidating
活动中无法验证吗?