Identity Server 4の.NET WEPAPI 2(コアではない)でAccessToken検証を設定します。 -- asp.net-web-api2 フィールド と identityserver4 フィールド 関連 問題

Set AccessToken Validation on a .net wepapi 2 (not core) with Identity server 4












2
vote

問題

日本語

IdentityServer 4認証を.NET COREでの認証の設定方法を知っています。つまり、 IdentityServer4.AccessTokenValidation で定義されている拡張機能を使用します。そして、私のスタートアップクラスのようにそれを設定するでしょう:

<事前> <コード> app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions { Authority = "http://localhost:5000", RequireHttpsMetadata = false, ApiName = "webapi" });

問題は、私は.NET 4.6 Web API2(コアではなく)に認証された要求をする必要があることです。そして同じパッケージは、そのために機能しません。

この質問私がしなければならないのは、 Identity Server 3 :IdentityServer3.AccessTokenValidation。

しかし、Web APIを要求するときに、私が得るのは401です。そして私はその背後にある理由を理解するために認証イベントの配線方法を知りません。これが私の構成です:

API Startup.cs:

<事前> <コード> app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions { Authority = "http://localhost:5000", RequiredScopes = new[] { "webapi" }, });

クライアントのstartup.cs:

<事前> <コード> app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions { AuthenticationType = "oidc", SignInAsAuthenticationType = "Cookies", Authority = "http://localhost:5000", RedirectUri = "http://localhost:3954/signin-oidc", ClientId = "MvcClient", Scope = "openid profile webapi offline_access", ResponseType = "code id_token", ClientSecret = "secret", UseTokenLifetime = false, TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = false, }, });

クライアントプロジェクトのTestController:

<事前> <コード> var tokenClient = new TokenClient("http://localhost:5000/connect/token", "MvcClient", "secret"); var tokenResponse = await tokenClient.RequestClientCredentialsAsync("webapi"); var client = new HttpClient(); client.SetBearerToken(tokenResponse.AccessToken); var content = await client.GetStringAsync("http://localhost:5004/api/identity");

ここでアクセストークンを正常に入手しました。しかし、 api/identity に要求するときに401を取得します。

これはIDP:

の設定です。 <事前> <コード> new ApiResource("webapi", "My API") [...] new Client { ClientId = "MvcClient", ClientName = "MVC Client", AllowedGrantTypes = GrantTypes.HybridAndClientCredentials, RequireConsent = true, ClientSecrets = { new Secret("secret".Sha256()) }, RedirectUris = { "http://localhost:3954/signin-oidc" }, PostLogoutRedirectUris = { "http://localhost:3954/signout-callback-oidc" }, AllowedScopes = { IdentityServerConstants.StandardScopes.OpenId, IdentityServerConstants.StandardScopes.Profile, "netcoremvcapi", "webapi" }, AllowOfflineAccess = true, }

これが失敗した理由は何ですか? identityServer3.AccessTokenValidationを使用してトークンを検証することができるという間違った仮定を誤っていますか?

英語

I know how to setup IdentityServer 4 Authentication in .Net core. That is: using the extensions defined in IdentityServer4.AccessTokenValidation. And I would set it up in my startup class like so:

    app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions     {         Authority = "http://localhost:5000",         RequireHttpsMetadata = false,          ApiName = "webapi"     }); 

The problem is that now I need to make authenticated requests to a .net 4.6 web api2 (not core). And the same package doesn't work for that.

According to this question all I have to do is to use the same package that was used for Identity server 3:IdentityServer3.AccessTokenValidation.

But After trying it out all I get is 401 when making requests to the web api. And I don't know how to wire authentication events to understand the reason behind it. Here is my configuration:

Api Startup.cs:

    app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions     {         Authority = "http://localhost:5000",         RequiredScopes = new[] { "webapi" },          }); 

Client Startup.cs:

            app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions             {                 AuthenticationType = "oidc",                 SignInAsAuthenticationType = "Cookies",                 Authority = "http://localhost:5000",                 RedirectUri = "http://localhost:3954/signin-oidc",                 ClientId = "MvcClient",                 Scope = "openid profile webapi offline_access",                 ResponseType = "code id_token",                 ClientSecret = "secret",                 UseTokenLifetime = false,                 TokenValidationParameters = new TokenValidationParameters                 {                     ValidateIssuer = false,                 }, }); 

TestController in the Client project:

    var tokenClient = new TokenClient("http://localhost:5000/connect/token", "MvcClient", "secret");     var tokenResponse = await tokenClient.RequestClientCredentialsAsync("webapi");      var client = new HttpClient();     client.SetBearerToken(tokenResponse.AccessToken);     var content = await client.GetStringAsync("http://localhost:5004/api/identity"); 

I successfully get an access token here. But get a 401 when making the request to api/identity.

Here is the Config in the IDP:

new ApiResource("webapi", "My API") [...]                 new Client                 {                     ClientId = "MvcClient",                     ClientName = "MVC Client",                     AllowedGrantTypes = GrantTypes.HybridAndClientCredentials,                      RequireConsent = true,                      ClientSecrets =                     {                         new Secret("secret".Sha256())                     },                      RedirectUris = { "http://localhost:3954/signin-oidc" },                     PostLogoutRedirectUris = { "http://localhost:3954/signout-callback-oidc" },                      AllowedScopes =                     {                         IdentityServerConstants.StandardScopes.OpenId,                         IdentityServerConstants.StandardScopes.Profile,                         "netcoremvcapi",                         "webapi"                     },                     AllowOfflineAccess = true,                 } 

Any idea why this might be failing? Am I making the wrong assumption that I can use IdentityServer3.AccessTokenValidation to validate the token?

</div
     

回答リスト

1
 
vote

最初の問題は、私のスタートアップクラスが呼ばれていなかったということでした。これは、 // HealthCheckService is a simple general purpose health check service type HealthCheckService interface { IsDatabaseOnline() bool } 3 パッケージを追加することによって解決されました。

それから面白くなった。 // HealthCheckService is a simple general purpose health check service type HealthCheckService interface { IsDatabaseOnline() bool } 4 にOWINランタイムに登録中に例外を取得しました:

<事前> <コード> // HealthCheckService is a simple general purpose health check service type HealthCheckService interface { IsDatabaseOnline() bool } 5

とその理由は、私のWeb API 2プロジェクトがOWIN実装カタナを使用しているためです。そして明らかにカタナはそのパッケージのv5​​.0をサポートしていません。説明されているように、 とここ

だから私はそのパッケージを最初に削除しなければならなかった(ダウングレードは依存関係のために機能しませんでした)。 Package Status16 のマイバージョンに依存しているため失敗しました。そしてもちろん、それは他のパッケージの依存関係のある別の問題につながりました....すべての依存パッケージを削除し、 // HealthCheckService is a simple general purpose health check service type HealthCheckService interface { IsDatabaseOnline() bool } 7 、次に Status18 を再インストールした後。それはすべて上記の同じ設定で働きました...

 

The first issue was that my startup class wasn't being called. That was solved by adding the Microsoft.Owin.Host.SystemWeb package.

Then it got interesting. I started getting an exception while registering OpenIdConnectAuthenticationMiddleware into the OWIN runtime:

Could not load type 'System.IdentityModel.Tokens.TokenValidationParameters' from assembly 'System.IdentityModel.Tokens.Jwt, Version=5.0.0.127 

And the reason is because my web api 2 project is using the Owin implementation Katana. And apparently Katana does not support v5.0 of that package. As described here and here.

So for that I had to remove that package first (downgrade didn't work due to dependency). That also failed because of the dependency on my version of the package Microsoft.Owin.Security.Jwt. And that, of course, led to another issue with a dependency of another package....after removing all the dependant packages and reinstalling System.IdentityModel.Tokens.Jwt v4.0.2 and then IdentityServer3.AccessTokenValidation. It all worked with the same setup described above...

</div
 
 

関連する質問

1  OAuth2でClientIDを保護する方法  ( How to secure clientid in oauth2 ) 
外付けのOAUTH2サーバー(IdentityServer4)を使ってAngular 2アプリを開発したいです。 各クライアントを一意性のために識別したいと考えています。しかし、Angular 2 / JavaScriptソースでClientIDを保護する方法...

0  Identity Serverとアクセストークンのクレーム  ( Identity server and access token claims ) 
Windows認証でIdentity Server 3を使用して、ユーザーのトークンにクレームを追加します。私はGetProfileDataAsyncを2回呼び出され、呼び出し元は要求されたクレームを持っていない "クレームProviderAccessTok...

7  他のユーザーのアクセストークンを取り消し、Identity Server 4でセッションを終了する方法はありますか?  ( Is there a way to revoke another users access tokens and end their session in i ) 
Identity Server 4で別のユーザーのアクセスを取り消すための推奨される方法はありますか?私が見ているユースケースは、現在ログインしているユーザーのためのシステムアクセスを取り消しています。 失効エンドポイントとできます。自分のアクセスを取り消...

1  Real SQL ServerとASP IDを持つIdentityServer4サンプル  ( Identityserver4 sample with asp identity with real sql server ) 
私は、最終的なサンプル(ASP.NET、EFコア、SQL)を実際のSQL Serverに対抗させるのに苦労しています。私が見つけることができるすべてのサンプルは、常にインメモリデータストアを選択するための実際のSQLを使用しません 接続文字列を変更しました <...

4  UseOpenIdConnectAuthentication - Message.Stateエラーメッセージを保護できません  ( Useopenidconnectauthentication unable to unprotect the message state error mes ) 
私のアプリケーションでopenIdconnectオプションとしてGoogleとAzure Active Directory権限を追加しようとしています。 別途追加した場合は、うまく機能します。 しかし、それらを追加すると、次のエラーメッセージが表示されます。 ...

3  SAML 2を使用したSSO他のIDプロバイダとともにSSO  ( Sso using identity server with saml 2 with other identity providers ) 
Identity Server 4を使用して認証と許可を実行し、クライアントがアプリケーションにアクセスして必要なトークン(Web API)にアクセスするために必要なトークンを取得できます。これは現在のアーキテクチャです: Identity Server...

2  IdentiyServer4:自動トークンの更新は外部トークンを更新しません  ( Identiyserver4 automatic token refresh doesnt update external tokens ) 
最後の数週間、私は私たちのシステムの1つのための新しいアイデンティティプロバイダーに取り組んできました。これは私がIdentityServerとOpenIDと協力していて、私はそれを働いていることを管理していましたが、これを使ってコンクリートの壁を押し続けてい...

2  Identity Serverは、Sucessfullログイン後にリダイレクトされません  ( Identity server does not redirect after sucessfull login ) 
MVCクライアントでIdentityServer4を設定しようとしています。 ASP IDを追加するまで、すべてがうまく機能します。 SQL ServerとIDを使用するコードを追加したとき、SucessfullログインIdentity Serverが私の...

1  Identity Serverウィンドウとユーザー名パスワード  ( Identity server windows and username password ) 
Identity Server 3のセットアップとWindows認証の操作、Identity ServerインスタンスとWindows Authは2つの別々のプロジェクトで、データベースにカスタムクレームを保存するため、 Web APIをWindowsを使用...

1  IdentityServer4 - Chromeのリダイレクトが停止しました  ( Identityserver4 redirects in chrome stopped working ) 
ASP.NET CORE 3.1で実行されているIdentityServer(V3.1.4 NUGET)の実装があります。 My Dev Machine(Windows 10)では、Chromeは認証が成功した後に角度サイトに戻りません。つまり、 <事前> ...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有