web-dev-qa-db-ja.com

OpenID Connect用のOWINミドルウェア-コードフロー(フロータイプ-AuthorizationCode)ドキュメント?

私の実装では、OpenID-Connect Server(Identity Server v3 +)を使用してAsp.net MVC 5アプリ(AngularJSフロントエンドを使用)を認証しています

OIDコードフロー(スコープOpen_IDを使用)を使用してクライアント(RP)を認証することを計画しています。OpenID接続ミドルウェアには、OWIN(カタナプロジェクト)コンポーネントを使用しています。

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

ID Server v3の一般的なコードフロー実装のサンプルはここにあります https://github.com/IdentityServer/IdentityServer3.Samples/tree/master/source

OWINミドルウェアを使用した同様のものを探していますか?誰かがポインターを持っていますか?

10
Karthik

編集:4.1リリース(2019年11月に出荷)の一部として、朗報、コードフロー、および_response_mode=query_サポートがついにカタナに追加されました ): https://github.com/aspnet/AspNetKatana/wiki/Roadmap#410-release-november-2019


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 for例。

29
Kévin Chalet

ピンポイントによる回答とコメントの返信は的を射ています。ありがとう!

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

もちろん、これはすべてのオープンソースプロジェクトの問題に言えることですが、私の場合、これは大きな問題の迅速な解決策だったので、オプションである可能性があることを共有したいと思いました

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

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

// 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;
    }
    ..
1
Johan Kronberg