2017-09-20 6 views
5

(編集 - 適切な修正が見つかり下記を参照してください!)ネットコア2.0のWeb APIは - 追加のアイデンティティは、JWTの認証を破る

OK - しかし、これはネットコア2.0および認証で私の最初の試みであります私はこれまでWeb API 2.0を使っていましたが、ここ数年の間にさまざまなMVCやWebforms ASPプロジェクトでかなり広く働いてきました。

.Net Coreを使用してWeb API ONLYプロジェクトを作成しようとしています。これにより、レポートを作成するためのマルチテナントアプリケーションのバックエンドが形成されるため、ユーザーを認証できる必要があります。通常は、JWTを使用する方法があります。まず、ユーザーを認証してトークンを生成し、それをクライアントに渡してすべてのAPI要求で使用します。データはEFコアを使用して保存および取得されます。

私は、この設定を得るための基本的な方法として、this postに従っています。これは正常に動作するように管理しました。ユーザー名/パスワードを受け入れ、有効な場合はトークンを返し、請求項に基づく。

私が必要とする次のことは、実際にユーザー/パスワード/ etcを管理することです。私はちょうど.Net Core Identityを使って、ユーザー/ロール、パスワードなどについて心配する準備が整ったコードがたくさんあると思っていました。私はカスタムUserクラスとから派生したUserRoleクラスを使用していましたとIdentityRoleクラスが、私は今すぐ標準のものに戻ってきました。

身分証明書を追加する方法がわかりません。&すべてのさまざまなサービス(rolemanager、usermanagerなど)を登録しなくても、認​​証を破棄する必要はありません。 Startup.ConfigureServicesクラス:

services.AddIdentity<IdentityUser, IdentityRole>() 
    .AddEntityFrameworkStores<MyContext>(); 

それはすべてうまくいかない、と私は要求を受信したとき、私はもはや主張を見ることができるので、すべてのポリシーがちょうどロックダウン、あなたが何を取得することはできません。

私はこれらの行がなければ、UserManager、RoleManager、UserStoreなどのエラーはすべてDIに登録されていません。

どうすればいいですか?アイデンティティを登録してコンテキストに正しく接続することはできますが、実際の認証メカニズムへの変更は避けてください。

私は公正なビットをオンラインで見たことがありますが、多くのチュートリアルなどは本当に有効ではないので、.Net Core 1.x以降に変更されています。

私はこのAPIアプリケーションにフロントエンドコードを使用するつもりはないので、フォームなどのクッキー認証は必要ありません。

編集
[OK]を、私は今、このコードでStartup.ConfigureServices()方法でJWT認証を設定することがわかってきました:「私は経由(示された行にブレークポイントを置く場合

services.AddAuthentication(
      JwtBearerDefaults.AuthenticationScheme) 
       .AddJwtBearer(options => 
       { 
       >>breakpoint>>> options.TokenValidationParameters = 
         new TokenValidationParameters 
         { 
          ValidateIssuer = true, 
          ValidateAudience = true, 
          ValidateLifetime = true, 
          ValidateIssuerSigningKey = true, 

          ValidIssuer = "Blah.Blah.Bearer", 
          ValidAudience = "Blah.Blah.Bearer", 
          IssuerSigningKey = 
          JwtSecurityKey.Create("verylongsecretkey") 

         }; 
       }); 

> >ブレークポイント>>> ")を実行しないとヒットするアイデンティティサービスを追加する行を追加しますが、それらの行を追加すると、は決してになります。これは、方法のどこでservices.AddIdentity()コールを呼び出しても問題ありません。私はこれが単なるラムダなので、後で実行されることになりますが、AddIdentityのものを認証を設定したり、コードをすぐに削除したりする方法はありますか?あなたが持っている場合、私は...アイデンティティのものはすでにそれを設定しているように私が設定した設定のためのラムダを実行しないことを選択したいくつかのコードがありますいくつかの点ですべてのことを読み取るための

感謝を想定:)

基本的には https://github.com/aspnet/Identity/issues/1376

私がしなければならなかった二重だったもの: -

EDIT見つかり
OK答えは、私は最終的には基本的に、まさにこの問題で、このGHの問題を発見した

ENS

services.AddAuthentication(
      JwtBearerDefaults.AuthenticationScheme) 
       .AddJwtBearer(options => 
... 

services.AddIdentity<IdentityUser, IdentityContext()への呼び出しが最初

変更から認証を追加するための呼び出しを行ったことUREこれはうるさく作成されたクッキーにつながるん

services.AddAuthentication(options => 
     { 
      options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; 
      options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; 
     }) 
      .AddJwtBearer(options => 
... 

が、これは私が言うことができる限り認証には使用されません。少なくとも、コントローラー/アクションへの要求にはベアラートークンを使用しています(少なくとも[Authorize(Policy = "Administrator")]または類似のセットを持っています)。

私はそれが何らかの方法で動作していないことがわかった場合、私はより多くをテストする必要があり、私はここに戻ってこれを更新しようとします。

(編集 - 今答えとしてで適切なソリューションを置く)

+0

あなたは私を救った。ありがとう –

+0

あなたはこれを質問に分解し、それからあなた自身が正しい答えとして答えることを検討すべきです。 – alwayslearning

+0

@alwayslearningは悪い考えではないので...そうしました。 – GPW

答えて

3

私は最終的に一緒に解決策を入れて、私は私のポストを編集したと私は実際にこれをで入れているユーザーalwayslearningの提案のように、回答。

okこれは適切に行うことができます。まず、上記の編集で指摘した認証オプションを使用する必要があります。これは問題ありません。 services.AddIdentity<TUser>()ではなくservices.AddIdentityCore<TUser>()を使用する必要があります。しかし、これは、ロール管理のためのすべてのものを追加するものではなく、使いたいロールのタイプを与えるための適切なコンストラクタが不足しているようです。 、次のことが(前にトークンを送信する)ユーザーログインを検証するときに、あなたが使用することを確認していることを確認することです

IdentityBuilder builder = services.AddIdentityCore<IdentityUser>(opt => 
     { 
      opt.Password.RequireDigit = true; 
      opt.Password.RequiredLength = 8; 
      opt.Password.RequireNonAlphanumeric = false; 
      opt.Password.RequireUppercase = true; 
      opt.Password.RequireLowercase = true; 
     } 
     ); 
     builder = new IdentityBuilder(builder.UserType, typeof(IdentityRole), builder.Services); 
     builder 
      .AddEntityFrameworkStores<MyContext>(); 
     //.AddDefaultTokenProviders(); 

     builder.AddRoleValidator<RoleValidator<IdentityRole>>(); 
     builder.AddRoleManager<RoleManager<IdentityRole>>(); 
     builder.AddSignInManager<SignInManager<IdentityUser>>(); 

がそれを行ってた:これは私の場合、私はこれをしなければならなかったことを意味しますSignInManager方法CheckPasswordSignInAsyncないPasswordSignInAsync

public async Task<IdentityUser> GetUserForLogin(string userName, string password) 
    { 
     //find user first... 
     var user = await _userManager.FindByNameAsync(userName); 

     if (user == null) 
     { 
      return null; 
     } 

     //validate password... 
     var signInResult = await _signInManager.CheckPasswordSignInAsync(user, password, false); 

     //if password was ok, return this user. 
     if (signInResult.Succeeded) 
     { 
      return user; 
     } 

     return null; 
    } 

あなたがPasswordSignInAsyncメソッドを使用している場合、あなたはランタイムエラーの再取得します。 IAuthenticationSignInHandlerが構成されていません。

私はこれがいつか誰かを助けてくれることを願っています。

+0

あなたは間違いなく私を助けました。どうもありがとう。 JWTやアイデンティティに関する経験がなくても解決策を見つけるのが難しい場合は、インターネット上に多くのチュートリアルがあります。 –

関連する問題