2017-04-12 85 views
1

我正在使用aspnet核心WEB Api應用程序。當令牌過期或者令牌未通過時,獲取404錯誤而不是401,而不是

雖然登錄我通過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。

回答

0

我有同樣的問題,並能夠通過不使用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; 
} 
相關問題