2015-11-11 30 views
6

私の実装では、Asp.net MVC 5アプリ(AngularJSフロントエンド付き)を認証するためにOpenID-Connect Server(Identity Server v3 +)を使用していますOpenID ConnectのOWINミドルウェア - コードフロー(フロータイプ - AuthorizationCode)のドキュメント?

OIDコードフロー(スコープOpen_IDを使用)を使用して、クライアント(RP)を認証します。 OpenID接続ミドルウェアについては、私はOWIN(Katana Project)コンポーネントを使用しています。

実装前に、OWINを使用してバックチャネルトークン要求、リフレッシュトークン要求プロセスなどを理解したいと思います。しかし、このタイプの実装に関するドキュメントは見つかりません(ほとんどの使用例は暗黙のフロー)。

私はOWINミドルウェアを使用して同様のものを探していますここで、IDサーバv3のhttps://github.com/IdentityServer/IdentityServer3.Samples/tree/master/source

のための一般的なコードのフロー実装のためのサンプルを見つけることができますか?誰にも指針はありますか?

答えて

17

OpenID Connectミドルウェアは、コードフロー:http://katanaproject.codeplex.com/workitem/247をサポートしていません(ただし、ASP.NET 5バージョンではすでに修正されています)。

実際には、暗黙のフロー(id_token)のみが正式にサポートされており、response_mode=form_post拡張子を使用する必要があります。認証コードフローを使用しようとすると、認証レスポンスから(見つからない)id_tokenを抽出できないため、コールバック中に例外がスローされます。

直接サポートされていませんが、ハイブリッドフロー(code + id_token (+ token))を使用することもできますが、トークンリクエスト部分を実装するのはあなた次第です。あなたは例としてhttps://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Server/blob/dev/samples/Nancy/Nancy.Client/Startup.cs#L82-L115を見ることができます。

+3

この回答には多くの知識が含まれています。これらすべての痛みポイントを発見する時間がかかっているはずです。 OPのコールバック中に*例外がスローされる:例外は、 'code'フロー(もちろん設計通り)を求める場合にidsvrの呼び出しで返されないIDトークンによるものです。 –

+1

@CrescentFreshは親切な言葉に感謝します!実際には、OIDCミドルウェアに数回貢献しました(たとえば、response_mode =クエリサポートを導入しました)、OWIN/KatanaとASP.NET 5(https://github.com/aspnet)のサーバー対応版を開発しました-contrib/AspNet.Security.OpenIdConnect.Server)、OIDCに関連する質問に満足している理由を説明しています;)精度を組み込むために私の答えを更新しました。 – Pinpoint

+0

あなたはこの質問で私を助けてくださいすることができます。https://stackoverflow.com/questions/47096113/token-based-implementation-in-webapi-to-secure-endpointsは –

0

Pinpointによる回答とコメントの返信はこちらにあります。ありがとう!

NuGetパッケージから離れてMicrosoft.Owin.Security.OpenIdConnectの変更されたソースコードを実行する場合は、form_postでコード(code)を取得できます。

もちろん、これはすべてのオープンソースプロジェクトの問題について言えるかもしれませんが、私の場合はこれが大きな問題のための迅速な解決策でしたので、にすることができます。

https://github.com/aspnet/AspNetKatanaからコードをダウンロードし、ソリューションにcsprojを追加し、AuthenticateCoreAsync()のhttps://github.com/aspnet/AspNetKatana/blob/dev/src/Microsoft.Owin.Security.OpenIdConnect/OpenidConnectAuthenticationHandler.csから行を削除しました。

これをバックチャネルコールと組み合わせて、独自の新しいClaimsIdentity()を作成してnotification.AuthenticationTicketとして設定する必要があります。

// Install-Package IdentityModel to handle the backchannel calls in a nicer fashion 
AuthorizationCodeReceived = async notification => 
{ 
    var configuration = await notification.Options.ConfigurationManager 
      .GetConfigurationAsync(notification.Request.CallCancelled); 

    var tokenClient = new TokenClient(configuration.TokenEndpoint, 
      notification.Options.ClientId, notification.Options.ClientSecret, 
        AuthenticationStyle.PostValues); 
    var tokenResponse = await tokenClient.RequestAuthorizationCodeAsync(
     notification.ProtocolMessage.Code, 
     "http://localhost:53004/signin-oidc", 
     cancellationToken: notification.Request.CallCancelled); 

    if (tokenResponse.IsError 
      || string.IsNullOrWhiteSpace(tokenResponse.AccessToken) 
      || string.IsNullOrWhiteSpace(tokenResponse.RefreshToken)) 
    { 
     notification.HandleResponse(); 
     notification.Response.Write("Error retrieving tokens."); 
     return; 
    } 

    var userInfoClient = new UserInfoClient(configuration.UserInfoEndpoint); 
    var userInfoResponse = await userInfoClient.GetAsync(tokenResponse.AccessToken); 

    if (userInfoResponse.IsError) 
    { 
     notification.HandleResponse(); 
     notification.Response.Write("Error retrieving user info."); 
     return; 
    } 
    .. 
関連する問題