Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.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
C# ASP Web API自定义身份验证。总是收到未经授权的响应_C#_Asp.net Web Api_Custom Authentication - Fatal编程技术网

C# ASP Web API自定义身份验证。总是收到未经授权的响应

C# ASP Web API自定义身份验证。总是收到未经授权的响应,c#,asp.net-web-api,custom-authentication,C#,Asp.net Web Api,Custom Authentication,我试图实现一个身份验证/授权过程,当用户登录时,生成一个JWT并将其放入cookie中(实现时,我主要使用的是本文,我认为它是针对.NET Core的,我使用的是.NET 4.6:)。到目前为止,这个过程工作正常,但是当我尝试使用cookie中的JWT向安全端点(用[Authorize]属性修饰)发出请求时,我总是得到401个未经授权的响应。即使JWT需要验证,并且正在从CustomJwtDataFormat类的Unprotect方法返回AuthenticationTicket 正如对这一问题的

我试图实现一个身份验证/授权过程,当用户登录时,生成一个JWT并将其放入cookie中(实现时,我主要使用的是本文,我认为它是针对.NET Core的,我使用的是.NET 4.6:)。到目前为止,这个过程工作正常,但是当我尝试使用cookie中的JWT向安全端点(用[Authorize]属性修饰)发出请求时,我总是得到401个未经授权的响应。即使JWT需要验证,并且正在从CustomJwtDataFormat类的Unprotect方法返回AuthenticationTicket

正如对这一问题的答复中所建议的那样 我在创建ClaimsIdentity时添加了AuthenticationType参数。但仍然是相同的401反应

以下是我的ConfigureAuth方法:

public void ConfigureAuth(IAppBuilder应用程序)
{
app.UseCookieAuthentication(新的CookieAuthenticationOptions
{
Provider=新CookieAuthenticationProvider(),
CookieName=“访问\u令牌”,
身份验证模式=
Microsoft.Owin.Security.AuthenticationMode.Active,
AuthenticationType=AuthenticationTypes.Password,
TicketDataFormat=新的CustomJwtDataFormat(
SecurityAlgorithms.HmacSha256,
设置Config.TokenValidationParameters)
});
}
CustomJwtDataFormat类的Unprotect方法:

public AuthenticationTicket取消保护(string protectedText)
{
var handler=新的JwtSecurityTokenHandler();
ClaimsPrincipal principal=null;
SecurityToken validToken=null;
尝试
{
principal=handler.ValidateToken(protectedText,this.validationParameters,out validToken);
var validJwt=作为JwtSecurityToken的validToken;
if(validJwt==null)
{
抛出新ArgumentException(“无效JWT”);
}
如果(!validJwt.Header.Alg.Equals(算法,StringComparison.Ordinal))
{
抛出新的ArgumentException($”算法必须为“{Algorithm}”);
}
}
捕获(SecurityTokenValidationException e)
{
var ex=e;
返回null;
}
捕获(e)
{
var ex=e;
返回null;
}
var identity=newclaimsidentity(principal.identies.FirstOrDefault().Claims,AuthenticationTypes.Password);
//验证通过。返回有效的AuthenticationTicket:
var authTicket=newauthenticationticket(identity,newauthenticationproperties());
回程票;
我的TokenValidationParameters:

公共静态TokenValidationParameters TokenValidationParameters=新的TokenValidationParameters { //签名密钥必须匹配! ValidateSuersigningKey=true, IssuerSigningKey=签名密钥, //验证JWT发行人(iss)索赔 validateisuer=true, ValidIssuer=“exampleisuer”, //验证JWT受众(aud)声明 ValidateAudience=true, ValidAudience=“ExampleAudience”, //验证令牌到期 ValidateLifetime=true, ClockSkew=时间跨度从分钟(5) }; GenerateToken方法:

public静态字符串GenerateToken(MetadataForToken令牌内容和元数据)
{
var symmetricKey=new SymmetricSecurityKey(Encoding.ASCII.GetBytes(tokenContentAndMetadata.SecretKey));
var tokenHandler=new JwtSecurityTokenHandler();
var now=DateTime.UtcNow;
var tokenDescriptor=新的SecurityTokenDescriptor
{
主题=新的索赔实体(tokenContentAndMetadata.Claims),
Expires=now.AddMinutes(Convert.ToInt32(tokenContentAndMetadata.ExpireMinutes)),
SigningCredentials=新的SigningCredentials(symmetricKey、tokenContentAndMetadata.SecurityAlgorithm),
Issuer=“ExampleIssuer”,
观众=“示例观众”
};
var sToken=tokenHandler.CreateToken(tokenDescriptor);
var token=tokenHandler.WriteToken(sToken);
返回令牌;
}
我做错了什么