c# - 如何在 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 进行其他身份验证。如何?
Configure
Startup.cs的方法
Configure(…)
{
app.UseAuthentication()
}
使用此代码,只能访问 ADFS 令牌和此用户,才能从控制器获取结果。但是,AzureAD 用户无法获得访问权限
我不知道如何为双重令牌授权制作此代码,如果一个令牌来自 ADFS 或其他令牌来自 AzureAD,我们的控制器可以响应
解决方案
您可以使用不同的模式名称设置多个 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
和ADFS
身份验证方案都尝试对请求进行身份验证:
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;
推荐阅读
- android - 关于 Activity 和 Fragment 生命周期的问题
- r - 尝试通过数据拟合 nls 模型时出现“奇异梯度”或“低于 minFactor 的步长因子”错误
- java - 如何通过esb连接两个web服务?
- python - 无法从 for 循环中的列表中提取字典
- c - 链表不包含下一个元素(C 语言)
- visual-studio-code - 在任务中访问 vscode 扩展的配置值
- java - Maven 上的 Lucene - java.lang.IllegalArgumentException UTF8 编码长于最大长度 32766 错误
- reactjs - 当在 React 中可见时,在 Modal 中调用 API 的正确方法是什么?
- spring - 在 SpringBoot 中从 @configuration 加载 1 个 bean
- django - 如何在views.py中重定向CreateView的url