如何在 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 令牌,来自 AAD
或 ADFS
的令牌可以访问你的控制器/动作,你可以制定一个策略让 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以上是关于如何在 ASP.NET Core Web API 中添加两个不同的令牌的主要内容,如果未能解决你的问题,请参考以下文章