如何在 ASP.NET Core Web API 中添加两个不同的标记

How add two different tokens in ASP.NET Core Web API

我需要我们控制器中的 Authorize 属性可以接受两种不同的令牌。

一个令牌由一个私有 ADFS 提供,另一个令牌由 AzureAd 提供。

几个 Ionic 客户端通过 ADFS,其他 Ionic 客户端通过 Azure AD

我的开发场景:ASP.NET Core 2.2 Web API

我的实际startup.cs(缩写)

ConfigureService()
{
    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                .AddJwtBearer((options =>
                {
                    options.Audience = Configuration["Adfs:Audience"];
                    options.Authority = Configuration["Adfs:Issuer"];
                    options.SaveToken = true;
                    options.TokenValidationParameters = new  TokenValidationParameters
                    {
                        ValidateIssuer = false
                    };
                }));
}

我需要使用 AzureAD 进行其他身份验证。怎么样?

Startup.cs的Configure方法

Configure(…)
{
     app.UseAuthentication()
}

使用此代码,只能访问 ADFS 令牌和此用户,才能从控制器获取结果。但是,AzureAD 用户无法获得访问权限

我不知道如何为双令牌授权制作此代码,如果一个令牌来自 ADFS 或其他令牌来自 AzureAD,我们的控制器可以响应

您可以使用不同的模式名称设置多个 JWT Bearer Authentication :

services.AddAuthentication()
    .AddJwtBearer("ADFS",options =>
    {
    options.Audience = Configuration["Adfs:Audience"];
    options.Authority = Configuration["Adfs:Issuer"];
    options.SaveToken = true;
    options.TokenValidationParameters = new TokenValidationParameters
    {
            ValidateIssuer = false
    };
    })
    .AddJwtBearer("AAD", options =>
    {
        //AAD jwt validation configuration
    });

如果你想让你的 controller/action 接受两个 jwt 令牌,来自 AADADFS 的令牌可以访问你的 controller/action ,你可以做一个让 AADADFS 身份验证方案都尝试对请求进行身份验证的策略:

services
.AddAuthorization(options =>
{
    options.DefaultPolicy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .AddAuthenticationSchemes("AAD", "ADFS")
        .Build();  
});

此外,如果您想知道令牌来自哪个架构,您可以检查用户身份中的特定声明,或者直接将身份验证架构值添加到事件中的用户声明中:

options.Events = new Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerEvents
            {
                OnTokenValidated = (context) =>
                {
                    var claimsIdentity = (ClaimsIdentity)context.Principal.Identity;
                    //add your custom claims here
                    claimsIdentity.AddClaim(new Claim("schema", "AAD"));

                    return Task.FromResult(0);
                }
            };

认证后开始行动:

var result = User.Claims.Where(c=>c.Type=="schema").FirstOrDefault().Value;