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

Tul*_*io 4 c# adfs azure azure-active-directory asp.net-core-webapi

我需要我们控制器中的 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
                    };
                }));
}
Run Code Online (Sandbox Code Playgroud)

我需要使用 AzureAD 进行其他身份验证。如何?

ConfigureStartup.cs的方法

Configure(…)
{
     app.UseAuthentication()
}
Run Code Online (Sandbox Code Playgroud)

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

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

Nan*_* Yu 6

您可以使用不同的架构名称设置多个 JWT 承载身份验证:

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
    });
Run Code Online (Sandbox Code Playgroud)

如果您想让您的控制器/操作接受两个 jwt 令牌、来自AADADFS可以访问您的控制器/操作的令牌,您可以制定一个策略,让AADADFS身份验证方案都尝试对请求进行身份验证:

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

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

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);
                }
            };
Run Code Online (Sandbox Code Playgroud)

并在身份验证后采取行动:

var result = User.Claims.Where(c=>c.Type=="schema").FirstOrDefault().Value;
Run Code Online (Sandbox Code Playgroud)