私の実装では、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ミドルウェアを使用した同様のものを探していますか?誰かがポインターを持っていますか?
編集: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例。
ピンポイントによる回答とコメントの返信は的を射ています。ありがとう!
ただし、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;
}
..