Authentication 当令牌过期或未传递令牌时,获取404错误而不是401错误
我正在使用aspnet核心WEB Api应用程序 登录时,我通过SignInManager验证用户,如下所示Authentication 当令牌过期或未传递令牌时,获取404错误而不是401错误,authentication,jwt,identity,core,Authentication,Jwt,Identity,Core,我正在使用aspnet核心WEB Api应用程序 登录时,我通过SignInManager验证用户,如下所示 await _signInManager.PasswordSignInAsync 在我为该用户生成jwt令牌之后 我在控制器方法中添加了[Authorize]标记 当我发送没有令牌或令牌无效的请求时,我得到的是404错误而不是401错误 这是startup.cs文件 var tp_options = new TokenProviderOptions {
await _signInManager.PasswordSignInAsync
在我为该用户生成jwt令牌之后
我在控制器方法中添加了[Authorize]标记
当我发送没有令牌或令牌无效的请求时,我得到的是404错误而不是401错误
这是startup.cs文件
var tp_options = new TokenProviderOptions
{
Audience = xyz,
Issuer = xyz,
SigningCredentials = new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256),
};
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
AutomaticAuthenticate = true,
AutomaticChallenge = true,
TokenValidationParameters = tokenValidationParameters,
AuthenticationScheme = JwtBearerDefaults.AuthenticationScheme,
});
app.UseStaticFiles();
app.UseFileServer();
app.UseIdentity();
我添加了一个app.UseIdentity()代码>。这是SigningManager验证登录名所必需的
如果我删除app.UseIdentity()
我将收到401错误,但signInManager将收到异常“未配置身份验证处理程序来处理方案:Identity.Application”
如何在这里实现这两种功能。我想同时使用JWT令牌验证和ASP标识。我遇到了同样的问题,并且能够通过不使用SignInManager进行用户身份验证来解决这个问题。SignInManager似乎在内部使用cookie身份验证,未经授权的请求被重定向到我尚未实现的登录页面,因此出现404响应
如果排除app.UseIdentity()并同时排除cookie中间件,则未经授权的请求应返回401响应。以下是用户身份验证代码:
public async Task<ClaimsIdentity> GetIdentity(string username, string password)
{
// Can't use SignInManager because it uses a cookie so requests for unauthorized actions will not return 401,
// it will return 404 (redirect to Login page that is missing)
// instead we validate the user using PasswordHasher
var user = await _userManager.FindByNameAsync(username);
if (user != null)
{
var passwordHasher = new Microsoft.AspNetCore.Identity.PasswordHasher<ApplicationUser>();
var passverificationResult = passwordHasher.VerifyHashedPassword(user, user.PasswordHash, password);
if (passverificationResult == PasswordVerificationResult.Success)
{
var claims = await _userManager.GetClaimsAsync(user);
return new ClaimsIdentity(new GenericIdentity(username, "Token"), claims);
}
}
return null;
}
public异步任务GetIdentity(字符串用户名、字符串密码)
{
//无法使用SignInManager,因为它使用cookie,因此未经授权的操作请求不会返回401,
//它将返回404(重定向到缺少的登录页面)
//相反,我们使用PasswordHasher验证用户
var user=await\u userManager.FindByNameAsync(用户名);
如果(用户!=null)
{
var passwordHasher=new Microsoft.AspNetCore.Identity.passwordHasher();
var passverificationResult=passwordHasher.VerifyHashedPassword(user,user.PasswordHash,password);
if(passverificationResult==PasswordVerificationResult.Success)
{
var claims=await_userManager.GetClaimsAsync(用户);
返回新的索赔实体(新的GenericEntity(用户名,“令牌”)、索赔;
}
}
返回null;
}