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