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

3

我是一名ASP.NET Core 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();。这个是为了signInManager验证登录所必需的。
如果我移除 app.UseIdentity(),我会得到401错误,但signInManager会抛出异常"没有配置处理程序来处理方案: Identity.Application"
我如何同时实现两种功能。我想要同时使用JWT令牌验证和ASP IDENTITY。
1个回答

2

我曾经遇到相同的问题,解决方法是不使用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;
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接