如何使用 Azure 身份验证对 ASP.NET Web API 和 ASP.NET MVC 应用程序进行身份验证,并添加可在客户端和服务器中用于逻辑实现的自定义声明?
我有一个 ASP.NET MVC 应用程序的 Azure 应用程序注册。当用户登录 ASP.NET MVC 应用程序时,他们会收到一个访问令牌,该令牌在标头中发送到 API 以获取 JSON 数据。这部分工作正常。
但是,我想向令牌添加自定义声明,以便当用户访问 API 时,我可以包含身份验证角色,例如
SomeRole
。此外,我想用基于角色的身份验证来装饰 ASP.NET MVC 应用程序。我怎样才能实现这个目标?
Program.cs
中的 ASP.NET MVC 代码:
builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(options =>
{
builder.Configuration.Bind("AzureAd", options);
options.ClientSecret = "89898";
options.SaveTokens = true;
options.Events ??= new OpenIdConnectEvents();
options.Events.OnTokenValidated += async context =>
{
// var someService = context.HttpContext.RequestServices.GetRequiredService<ISomeService>();
// var someValue = await someService.SomeMethod();
context.Principal.AddIdentity(new ClaimsIdentity(new List<Claim> { new Claim("Foo", "Bar") }));
};
})
.EnableTokenAcquisitionToCallDownstreamApi(new string[] { "api://123/.default" })
.AddInMemoryTokenCaches();
Program.cs
中的 ASP.NET Web API 代码:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(options =>
{
builder.Configuration.Bind("AzureAd", options);
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidIssuer = $"https://sts.windows.net/{builder.Configuration["AzureAd:TenantId"]}/",
ValidateAudience = true,
ValidAudience = "api://123",
ValidateLifetime = true,
ClockSkew = TimeSpan.FromMinutes(5)
}
});
实现此功能的技巧是了解
.AddMicrosoftIdentityWebApp()
和 .AddMicrosoftIdentityWebApi()
在使用“选项模式”方面有何不同。提供的 AuthenticationBuilder
扩展方法不同。但在本质上,这两种身份验证方案实际上非常相似,并且可以以相同的方式进行配置。
var authConfig = Configuration.GetSection("AzureAd");
services.AddAuthentication()
.AddMicrosoftIdentityWebApi(authConfig);
services.AddSingleton<IConfigureOptions<JwtBearerOptions>, ConfigureJwtOptions>();
public class ConfigureJwtOptions: IConfigureNamedOptions<JwtBearerOptions>{
public void Configure(JwtBearerOptions options) { }
public void Configure(string name, JwtBearerOptions options) {
if (name == JwtBearerDefaults.AuthenticationScheme) {
options.Events.OnTokenValidated += async context => {
// configure web api token validation
};
}
}
}
var authConfig = Configuration.GetSection("AzureAd");
services.AddAuthentication()
.AddMicrosoftIdentityWebApp(authConfig);
services.AddSingleton<IConfigureOptions<MicrosoftIdentityOptions>, ConfigureMSOptions>();
public class ConfigureMSOptions: IConfigureNamedOptions<MicrosoftIdentityOptions>{
public void Configure(JwtBearerOptions options) { }
public void Configure(string name, MicrosoftIdentityOptions options) {
if (name == OpenIdConnectDefaults.AuthenticationScheme) {
options.Events.OnTokenValidated += async context => {
// configure web app token validation
};
}
}
}
您甚至可以将以上内容组合到单个 asp.net core 应用程序中。定义多个身份验证策略,以划分每个身份验证方案可以访问哪些端点。