タイトル通り。
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);
}
};
});
雑ですけど目的の処理はこれで実現できます。