如何使用带有自定义声明的 Azure 身份验证对 ASP.NET Web API 和 ASP.NET MVC 应用程序进行身份验证?

问题描述 投票:0回答:1

如何使用 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)
    }
});
c# asp.net-core azure-web-app-service azure-identity
1个回答
0
投票

实现此功能的技巧是了解

.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 应用程序中。定义多个身份验证策略,以划分每个身份验证方案可以访问哪些端点。

© www.soinside.com 2019 - 2024. All rights reserved.