ASP.NET Core で OpenID Connect を使って認証するときにlogin_hintだしたい

タイトル通り。
ASP.NET CoreでOpenID Connectを使って認証する際にあらかじめユーザーID等を埋め込んでOpenIDのサーバーに渡したい(Azure ADとかだとID選択画面パスしてパスワード入力画面をすぐ出したい)時にはまったのでメモ。

アクション内でリダイレクトする際に以下のようにします。

var props = new AuthenticationProperties()
{
    RedirectUri = Url.Action("ExternalLoginCallback"),
    Items =
    {
        { "returnUrl", ReturnUrl },
        { "scheme", AuthenticationScheme },
        { "login_hint", Username }
    }
};
return Challenge(props, AuthenticationScheme);

でもこのままだとリダイレクトするときにlogin_hintが無くなります。回避策はOpenIdConnectのOnRedirectToIdentityProvidor イベントで追加する感じで。(というかAuthenticationPropertiesの意味とは…)

services.AddAuthentication()
.AddOpenIdConnect("aad", "Azure AD", options =>
{
    // :
	// 他の項目は省略
    // :

    options.Events = new OpenIdConnectEvents
    {
        OnRedirectToIdentityProvider = context =>
        {
            var username = context.Properties.Items["login_hint"];
            if (!string.IsNullOrEmpty(username))
            {
                context.ProtocolMessage.SetParameter("login_hint", username);
            }

            return Task.FromResult(0);
        }
    };
});

雑ですけど目的の処理はこれで実現できます。

参考: ASP.Net Core 2.0: using OpenId Connect authentication running under an IIS site that has Windows Authentication enabled

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中