新しいプロトコルの追加¶
IdentityServer4では、OpenID ConnectとOAuth 2.0のビルトインサポート以外の他のプロトコルのサポートを追加することができます。
これらの追加のプロトコルエンドポイントをミドルウェアまたはMVCコントローラなどを使用して追加できます。いずれの場合も、ASP.NET Core DIシステムにアクセスすることができ、クライアント定義やキーマテリアルへのアクセスなどの内部サービスを再利用できます。
WS-Federationサポートを追加するためのサンプルがここにあります。
典型的な認証ワークフロー¶
認証リクエストは通常、次のように動作します。
- 認証要求がプロトコルエンドポイントに到着する
- プロトコルエンドポイントは入力検証を行います
- 戻り値がプロトコルエンドポイントに設定されたログインページへのリダイレクト(ユーザーが匿名の場合)
- 現在のリクエストの詳細へのアクセス IIdentityServerInteractionService
- ユーザーの認証(ローカルまたは外部認証ミドルウェア経由)
- ユーザーのサインイン
- プロトコルエンドポイントにリダイレクトする
- プロトコル応答の作成(トークンの作成とクライアントへのリダイレクト)
便利なIdentityServerサービス¶
上記のワークフローを実現するには、IdentityServerとのやりとりのポイントが必要です。
設定へのアクセスとログインページへのリダイレクト
IdentityServerOptions クラスにコードを注入することで、IdentityServer設定にアクセスできます。これは、例えば、ログインページへの設定されたパスを持っています:
var returnUrl = Url.Action("Index");
returnUrl = returnUrl.AddQueryString(Request.QueryString.Value);
var loginUrl = _options.UserInteraction.LoginUrl;
var url = loginUrl.AddQueryString(_options.UserInteraction.LoginReturnUrlParameter, returnUrl);
return Redirect(url);
ログインページと現在のプロトコル要求との間の相互作用
IIdentityServerInteractionServiceパースと検証コンテキストオブジェクトにプロトコルの戻りURLを回すサポート:
var context = await _interaction.GetAuthorizationContextAsync(returnUrl);
デフォルトでは、インタラクションサービスはOpenID Connectプロトコルメッセージのみを認識します。サポートを拡張するには、あなた自身で書くことができますIReturnUrlParser:
public interface IReturnUrlParser
{
bool IsValidReturnUrl(string returnUrl);
Task<AuthorizationRequest> ParseAsync(string returnUrl);
}
そしてパーサーをDIに登録してください:
builder.Services.AddTransient<IReturnUrlParser, WsFederationReturnUrlParser>();
これにより、ログインページはクライアントの設定やその他のプロトコルパラメータのような情報にアクセスできます。
プロトコル応答を作成するためのコンフィグレーションとキーマテリアルへのアクセス
IKeyMaterialService をコードに挿入すると、設定された署名資格情報と検証キーにアクセスできます。
var credential = await _keys.GetSigningCredentialsAsync();
var key = credential.Key as Microsoft.IdentityModel.Tokens.X509SecurityKey;
var descriptor = new SecurityTokenDescriptor
{
AppliesToAddress = result.Client.ClientId,
Lifetime = new Lifetime(DateTime.UtcNow, DateTime.UtcNow.AddSeconds(result.Client.IdentityTokenLifetime)),
ReplyToAddress = result.Client.RedirectUris.First(),
SigningCredentials = new X509SigningCredentials(key.Certificate, result.RelyingParty.SignatureAlgorithm, result.RelyingParty.DigestAlgorithm),
Subject = outgoingSubject,
TokenIssuerName = _contextAccessor.HttpContext.GetIdentityServerIssuerUri(),
TokenType = result.RelyingParty.TokenType
};