1

私はASP.netコアWeb APIを取得しようとしています。JSON Webトークン認証が正しく機能しています。私は、IdentityServer4とアプリケーションを正常に統合し、ASP.netのコアアイデンティティに基づいてログインを処理しています。ASP.Net Core Web APIアイデンティティを作成する方法無許可で401を返す

ただし、認証が失敗すると、APIはクライアントをログインページにリダイレクトしようとすると302の結果を返します。しかし、これは純粋なWeb APIであり、ユーザーページやユーザーが直接対話するものはありません。

ログインページにリダイレクトするのではなく、401を返すようにするにはどうすればよいですか?

ConfigureServicesのアイデンティティ部分は次のようになります。

 // ASP.net Identity 
     var identityBackingStoreConnectionString = configuration["identity:backingStore"]; 

     services 
      .AddIdentityWithMongoStoresUsingCustomTypes<MyApplicationUser, IdentityRole>(
       identityBackingStoreConnectionString) 
      .AddDefaultTokenProviders(); 

     services.AddSingleton<IClientStore, MyIdentityStore>(); 

     // IdentityServer4 
     services.AddIdentityServer().AddTemporarySigningCredential() 
      .AddInMemoryApiResources(MyResourceStore.GetAllResources()) 
      .AddAspNetIdentity<MyApplicationUser>() 
      .AddTemporarySigningCredential(); 

と構成の関連する(と思う)の部分は次のようになります。

 app.UseIdentity(); 

     app.UseIdentityServer(); 
     app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions() 
     { 
      Authority = "http://localhost:5000/", 
      RequireHttpsMetadata = false, 
      ApiName = "myapi", 
      AutomaticAuthenticate = true, 
      JwtBearerEvents = new JwtBearerEvents() 
      { 
       OnAuthenticationFailed = async context => context.Response.StatusCode = 401 
      } 
     }); 

     app.UseMvc(); 

あなたが見ることができるように、私が試してみましたOnAuthenticationFailedイベントをオーバーライドしますが、使用できません。

システムを401に戻す方法については、何かアドバイスをいただければ幸いです。

答えて

2

アイデンティティ・サーバーは、私はあなたがapp.UseIdentityServer()を作り、app.UseIdentityServerAuthentication()それのために一緒に暮らすことができるとは思わない401

302への変換を内部的にクッキー認証を使用しています。

しかし、簡単に回避策を見つけることができます。 (5001:ローカルホストで5000及びアプリケーションローカルホストに例えば同一のサーバ)

最高の別のアプリケーションのIDサーバをホストすることです。これは、より良いフィット代わりにあなたがローカルホストのような別のサブパスでIdentity ServerとAPIを配置しようとすることができ、オープンIDの概念を接続し、あなたがofficial GitHub

で例のトンを楽しむことができます:5000/idsrvはlocalhost:5000/APIapp.UseWhenを使用してください。たとえば、

app.UseWhen(
    c => c.Request.Path.StartsWithSegments(new PathString("/api")), 
    branch => { 
     branch.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions() 
     { 
      Authority = "http://localhost:5000/idsrv", 
      RequireHttpsMetadata = false, 
      ApiName = "myapi", 
      AutomaticAuthenticate = true, 
     }); 
     branch.UseMvc(); 
    }); 

app.UseWhen(
    c => c.Request.Path.StartsWithSegments(new PathString("/idsrv")), 
    branch => { 
     branch.UseIdentityServer(); 
     branch.UseMvc(); 
    }); 

また、このアプローチはエラーが発生しやすく、別のアプリケーションを検討したいと思います。

+0

私はUseWhenのアプローチを得ることができませんでしたが、2つのコンポーネントを別々のシステムに分けることは完全に機能しました。ご助力ありがとうございます! –

関連する問題