2017-12-11 11 views
0

WSFederation認証プロバイダをIdentityServer4に追加しようとしています。 最近、Microsoft.AspNetCore.Authentication.WsFederation Preview 2がリリースされ、これを通常のAsp.NetCore-Applicationに追加することができました。IdentityServer4として.Net Core WSFederationプレビュー2を持つWSFederation-clientとして

しかし、それをIdentityServer4 EntityFramework-Quickstart-Exampleに追加するのは苦労しています。

これは私が私のStartup.cs/ConfigureServices-方法でAuthenticationProviderを追加する方法です:

services.AddAuthentication() 
       .AddWsFederation("WsFederation", options => 
       { 
        options.Wtrealm = realm; 
        options.MetadataAddress = metadata; 
       }) 

私はフロントエンドでWSFederationためのボタンを持って、私もサインインすることができます。しかし、コールバックした後、私が取得。このエラー:これはどこから来るのか、私は理解することができます

InvalidOperationException: sub claim is missing IdentityServer4.Hosting.IdentityServerAuthenticationService.AssertRequiredClaims(ClaimsPrincipal principal)

、それは「サブ」-claimを期待し、IdentityServer4のIdentityServerAuthenticationService.csでthis lineだ - WSFedは、このような主張を返しません。

if (principal.FindFirst(JwtClaimTypes.Subject) == null) throw new InvalidOperationException("sub claim is missing"); 

彼らはこのために使用することができように見えるクイックスタート・プロジェクトでは、いくつかのテーブル、特に2がありますが、私の知る限り見ることができるように、私は、この主張を設定することはできません。 dbo.IdentityResources-table dbo.IdentityClaims-table

私はすでに主張の代わりに使用したいクレームをテーブルに追加しようとしましたが、それは影響を与えていないようです。また、データベースが私が追加するアイデンティティプロバイダにどのようにマップするのかもわかりませんコードで私は次のステップについてのヒントがあればうれしく思います。もしあなたが何か良い例を知っていれば、それはさらに良いでしょう。

P.S .:このトピックに関するいくつかの質問は既にありますが、WSFederationの.Netコア実装が利用可能になる前か、WSFederation-serverのサンプルを参照してクライアントを参照する前であってもかまいません。

+0

私は(「サブ」のような)IdentityProvider互換請求に(UPNのような)WSFedクレームを変換するWSFederation認証を拡張するカスタムAuthenticationproviderようなものを実装するためのアイデアを持っていた - しかし、これが最もエレガントな方法であるかどうかはわかりません。ソースコードを踏んで、ドキュメントを読んでもっと調べようとしています。 – Compufreak

答えて

1

@leastprivilegeのおかげで、私はサブを提供するために、次の回避策を実装しました-claim:

services.AddAuthentication() 
       .AddWsFederation("WsFederation", options => 
       { 
        options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme; 
        options.Wtrealm = realm; 
        options.MetadataAddress = metadata; 
        options.Events.OnTicketReceived += OnTicketReceived; 
       }) 

/* some more code inbetween */ 

    /// <summary> 
    /// Transform the UPN-claim to the sub-claim to be compatible with IdentityServer4 
    /// </summary> 
    private async Task OnTicketReceived(TicketReceivedContext ticketReceivedContext) 
    { 
     var identity = ticketReceivedContext.Principal.Identities.First(); 
     identity.AddClaim(new Claim("sub", ticketReceivedContext.Principal.FindFirstValue("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier"))); 

    } 
2

WS-Fedプロバイダから返されるクレームに対してクレーム変換を行う必要があります。どちらのWS-連銀ハンドラ自体にイベントを処理することにより、 - またはクイックスタートUIで使用される「ExternalLoginCallback」パターンを用いて:

https://github.com/IdentityServer/IdentityServer4.Quickstart.UI/blob/release/Quickstart/Account/AccountController.cs#L203

+0

ありがとうございます - ExternalLoginCallbackがヒットする前にサブクレームのチェックが行われるため、IdentityServerをフォークせずに唯一のオプションのように思えるので、ExternalLoginCallbackの前にヒットする必要があるのでAuthenticationHandler自体で変換を行います。私はそれを試して、報告を返すよ。 – Compufreak

+0

私は、OnTicketReceived-Eventhandlerを実装してサブクレームで新しいIDを追加しました。私は自分の質問の一番下にコードを追加しました。これが適切な解決策だと思うのであれば、答えにコードを追加して解決できるとマークすることができます。 – Compufreak

+0

ExternalLoginCallbackはIdentityServerコードベースの一部ではありません。それはUIにあります。だから何でも好きです。 – leastprivilege

関連する問題