Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Authentication 一个ASP.NET Core 2.2控制器中的多个身份验证方法_Authentication_Asp.net Core - Fatal编程技术网

Authentication 一个ASP.NET Core 2.2控制器中的多个身份验证方法

Authentication 一个ASP.NET Core 2.2控制器中的多个身份验证方法,authentication,asp.net-core,Authentication,Asp.net Core,我有一个ASP.NET Core 2.2应用程序正在CentOS上运行,但仍然需要基于Active Directory属性的授权。因此,我使用Novell的LDAP库编写了一个自定义的AuthenticationHandler,它将确定所需的声明。这一切都很好,但速度很慢 因此,我添加了JWT作为第二种身份验证方法。这一点本身也是有效的。Startup.cs中的配置如下所示: services.AddAuthentication(JwtBearerDefaults.AuthenticationS

我有一个ASP.NET Core 2.2应用程序正在CentOS上运行,但仍然需要基于Active Directory属性的授权。因此,我使用Novell的LDAP库编写了一个自定义的
AuthenticationHandler
,它将确定所需的声明。这一切都很好,但速度很慢

因此,我添加了JWT作为第二种身份验证方法。这一点本身也是有效的。Startup.cs中的配置如下所示:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(cfg=>{
cfg.RequireHttpsMetadata=true;
cfg.SaveToken=true;
cfg.TokenValidationParameters=新的TokenValidationParameters(){
//为简洁起见省略
};
})
.AddScheme(Constants.MyAuthenticationScheme,null);
services.AddAuthorization(o=>{
o、 AddPolicy(Constants.authorizationpolicy,p=>p.requirrecall(ClaimTypes.GroupSid,“group”);
});
我花了相当长的时间才发现的问题出现在以下情况中:首先,我只想将承载令牌用于读取请求,而不是更改。其次,XSRF令牌需要使用
[ValidateAntiForgeryToken]
属性的操作才能使用验证方法来验证页面,因此我必须在这里使用自己的方法。因此,我提出了以下构想:

[授权(策略=常量。授权策略)]
[产生(“应用程序/json”)]
[路线(“api/结构”)]
[ApiController]
公共密封类DirectoryStructureController:ControllerBase{
//...
[HttpPost]
[路线(“创建”)]
[授权(AuthenticationSchemes=Constants.MyAuthenticationScheme,
策略=常数。授权策略)]
[ValidateAntiForgeryToken]
公共操作结果创建([FromForm]字符串文件夹){
//...
}
}
此构造有效–它对
Create
使用我的自定义身份验证,对其他操作使用JWT(因为这是默认设置),但仅当
Create
是在控制器上调用的第一个操作时。如果我之前调用了任何其他操作(使用JWT),
Create
会失败,401带有
www-authenticate:Bearer
头。使用JWT一次会“烧坏”控制器,使其无法再使用我的自定义处理程序

有办法解决这个问题吗?我想我只能为创建和更新添加另一个控制器,但我不愿意将应用程序逻辑拆开。那么是否存在每个方法的修复

提前感谢,, 克里斯托夫

编辑:自定义身份验证处理程序相当复杂,但以下最低版本复制了该行为(它对每个人进行身份验证并发出所需的组声明):

公共密封类MyAuthenticationHandler:AuthenticationHandler{
公共MyAuthenticationHandler(IOptionsMonitor选项、iLogger工厂记录器、UrlEncoder编码器、ISystemClock时钟)
:base(选项、记录器、编码器、时钟){}
受保护的覆盖任务handleAuthenticateAync(){
风险值索赔=新[]{
新索赔(ClaimTypes.Name,“用户”),
新索赔(ClaimTypes.GroupSid,“组”)
};
var identity=新的索赔实体(索赔,this.Scheme.Name);
var principal=新的ClaimsPrincipal(身份);
var票证=新的身份验证票证(主体,this.Scheme.Name);
返回Task.FromResult(AuthenticateResult.Success(票证));
}
发出JWT承载令牌的相应控制器为:

[授权(AuthenticationSchemes=Constants.MyAuthenticationScheme)]
[路由(“api/[控制器]”)]
[ApiController]
公共类令牌控制器:ControllerBase{
[HttpGet]
public IActionResult Get(){
风险值索赔=新[]{
新索赔(ClaimTypes.Name,“用户”),
新索赔(ClaimTypes.GroupSid,“组”)
};
var creds=new SigningCredentials(new SymmetricSecurityKey(Encoding.UTF8.GetBytes(“key”))、SecurityAlgorithms.HmacSha256);
var expires=DateTime.UtcNow+TimeSpan.FromMinutes(5);
var token=新的JwtSecurityToken(“发行人”、“受众”、声明,
过期:过期,
签署证书:信誉);
var handler=新的JwtSecurityTokenHandler();
var retval=handler.WriteToken(令牌);
归还这个。好的(新的){
令牌=令牌,
寿命=时间跨度。从分钟(5)
});
}
}
在JavaScript中,可以检索如下标记

$.ajax({
url:“/api/token”
}).done(函数(数据、状态文本、xhdr){
//保存令牌
}.bind(this)).fail(函数(xhr、状态、错误){
//处理错误
}.约束(这个);
像这样使用它

$.ajax({
url:“/api/structure/somemethod”
发送前:函数(xhr){
setRequestHeader('Authorization'、'Bearer'+令牌);
}
}).done(函数(数据、状态文本、xhdr){
//使用某种方法的结果
}.bind(this)).fail(函数(xhr、状态、错误){
//处理错误
}.约束(这个);
在此调用之后,任何后续调用都将失败,如上所述:

$.ajax({
键入:“POST”,
url:“/api/structure/create”,
数据类型:“json”,
数据:'='+文件夹,
标题:{
'RequestVerificationToken':xsrftok//From@Xsrf.GetAndStoreTokens(this.HttpContext.RequestToken
}
}).done(函数(数据、状态文本、xhdr){
//显示成功消息
}.bind(this)).fail(函数(xhr、状态、错误){
//处理错误
}.约束(这个);

您是如何实现
MyAuthenticationHandler
的?是否有任何演示重现您的问题?我无法发布所有内容,因为它分布在多个类中,但我添加了一个验证器和一个控制器,它们产生相同的行为。正如您所看到的,这两种方法都发出相同的声明,但我需要使用
MyAuthenticationHandler
因为
[ValidateAn]