2017-04-12 11 views
1

私はaspnetコアWEB Apiアプリケーションを使用しています。トークンが期限切れになったとき、またはトークンが渡されなかったときに、401の代わりに404エラーが発生する

ログイン中私はこのようなSignInManagerを通じてユーザーを検証しています。

await _signInManager.PasswordSignInAsync 

私はそのユーザーのjwtトークンを生成しています。

コントローラメソッドに[Authorize]タグを追加しました。

アウトトークンまたは無効なトークンでリクエストを送信しているときに、401エラーではなく404エラーが発生しています。 "app.UseIdentity();"

これは私が追加した

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(); 

startup.csファイルです。これは、signInMangerがログインを検証するために必要です。

i「がapp.UseIdentity()」私は401エラーを取得していますが、signInManagerは例外が取得されて削除した場合、「認証なしハンドラがスキームを処理するように設定されていない:Identity.Application」

は、どのように私は両方の機能を実現することができますがここに。私は、JWTトークン検証とASP IDENTITYの両方を使用したい。

答えて

0

私は同じ問題を抱えていて、ユーザー認証にSignInManagerを使用しないことで対処できました。 SignInManagerは内部的にCookie認証を使用しており、未承認のリクエストは実装されていないLoginページにリダイレクトされるため、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; 
} 
関連する問題