新しいプロトコルの追加

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
};