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

Posted

技术标签:

【中文标题】如何在 ASP.NET Core Web API 中添加两个不同的令牌【英文标题】:How add two different tokens in ASP.NET Core Web API 【发布时间】:2019-12-09 11:50:05 【问题描述】:

我需要我们控制器中的 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 Token 和此用户,才能从控制器获取结果。但是,AzureAD 用户无法获得访问权限

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

【问题讨论】:

【参考方案1】:

您可以使用不同的架构名称设置多个 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
    );

如果你想让你的控制器/动作接受两个 jwt 令牌,来自 AADADFS 的令牌可以访问你的控制器/动作,你可以制定一个策略让 AAD 和 @ 987654325@ 身份验证方案试图对请求进行身份验证:

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;

【讨论】:

德克萨斯州,南。发送旅游帮助。 @Tulio ,如果回复有帮助的话。请标记为帮助其他遇到相同问题的人的答案 ¿我可以在这两种情况下使用 de AddJwtBearer?也许对于 AzureAD .AddAzureAdBearer(options => Configuration.Bind("AzureAd", options)) 是更好的方法? (来自 AuthenticationBuilder 的扩展方法)。 AddAzureAdBearer 是 AddJwtBearer for AAD 的包装器,您可以使用其中任何一个。 这与您的 adfs 令牌配置有关。类似 `.AddJwtBearer(options => options.Authority = "https://.../adfs"; options.Audience = "urn:microsoft :userinfo"; // 使用 jwt.io 取自客户端令牌 options.MetadataAddress = "adfs 元数据地址"; options.TokenValidationParameters = new TokenValidationParameters() ValidIssuer = "https://.../adfs/services/trust" , ValidAudiences = new List "web app id" , ;`

以上是关于如何在 ASP.NET Core Web API 中添加两个不同的令牌的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Asp.net Core Web Api 中默认使用 Newtonsoft.Json?

如何在 ASP.NET Core Web API 中使用 MassTransit 事件总线?

如何在 asp.net core web api 中绑定 Json Query 字符串

ASP.NET Core Web API - 如何在中间件管道中隐藏 DbContext 事务?

Asp.Net Core Web API 应用程序:如何更改监听地址?

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