Authentication 当令牌过期或未传递令牌时,获取404错误而不是401错误

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 {

我正在使用aspnet核心WEB Api应用程序

登录时,我通过SignInManager验证用户,如下所示

 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;
}