C# ASP Web API自定义身份验证。总是收到未经授权的响应
我试图实现一个身份验证/授权过程,当用户登录时,生成一个JWT并将其放入cookie中(实现时,我主要使用的是本文,我认为它是针对.NET Core的,我使用的是.NET 4.6:)。到目前为止,这个过程工作正常,但是当我尝试使用cookie中的JWT向安全端点(用[Authorize]属性修饰)发出请求时,我总是得到401个未经授权的响应。即使JWT需要验证,并且正在从CustomJwtDataFormat类的Unprotect方法返回AuthenticationTicket 正如对这一问题的答复中所建议的那样 我在创建ClaimsIdentity时添加了AuthenticationType参数。但仍然是相同的401反应 以下是我的ConfigureAuth方法: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 正如对这一问题的
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);
返回令牌;
}
我做错了什么