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

时间:2017-04-12 02:07:03

标签: authentication jwt identity core

我正在使用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();。这是signInManger验证登录所必需的。

如果我删除app.UseIdentity()我收到401错误,但signInManager正在异常“没有配置身份验证处理程序来处理该方案:Identity.Application”

我怎样才能在这里实现这两个功能。我想使用JWT令牌验证和ASP IDENTITY。

1 个答案:

答案 0 :(得分:1)

我有同样的问题,并且能够通过不使用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;
 }