Azure AD OpenID登录请求添加login_hint无效,是否需类似GoogleOAuth2的重写?
解决Azure AD OpenID Connect中login_hint不生效的问题
你说得没错,和Google OAuth2的场景类似,Azure AD的OpenID Connect中间件默认不会把AuthenticationProperties.Dictionary里的所有键自动映射到授权请求的查询参数里,所以直接添加login_hint是不会生效的。你需要通过重写中间件的RedirectToIdentityProvider通知事件,手动把这个参数注入到授权请求中。
具体步骤:
- 修正原代码的小问题:首先注意你写的
"login_hint "后面多了个空格,这会导致参数名不匹配,先把这个空格去掉,改成"login_hint"。 - 配置OpenID Connect中间件的通知事件:在Startup类配置中间件的时候,注册
RedirectToIdentityProvider事件,在事件处理逻辑里把login_hint参数添加到授权请求中。
代码示例:
首先是Startup里的中间件配置:
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions { ClientId = "你的客户端ID", Authority = "https://login.microsoftonline.com/你的租户ID", RedirectUri = "你的默认回调地址", // 其他必要配置(比如TokenValidationParameters等) Notifications = new OpenIdConnectAuthenticationNotifications { RedirectToIdentityProvider = context => { // 从AuthenticationProperties中取出预先设置的login_hint if (context.OwinContext.Authentication.AuthenticationResponseChallenge? .Properties.Dictionary.TryGetValue("login_hint", out var loginHint)) { // 将参数添加到授权请求的查询字符串中 context.ProtocolMessage.SetParameter("login_hint", loginHint); } return Task.FromResult(0); } } });
然后是你发起Challenge的代码(修正空格问题后):
var properties = new AuthenticationProperties(); properties.RedirectUri = "someCallbackUrl"; properties.Dictionary["login_hint"] = "SomeUsername"; // 去掉了多余的空格 AuthenticationManager.Challenge(properties, OpenIdConnectAuthenticationDefaults.AuthenticationType);
这样配置后,当你发起认证挑战时,中间件就会自动把login_hint参数追加到Azure AD的授权请求URL中,和你手动添加查询字符串的效果一样。
本质上,这个逻辑和Google OAuth2需要重写Provider的道理是相通的——第三方认证中间件只会处理标准的认证参数,自定义或扩展参数都需要通过这类事件来手动注入。
内容的提问来源于stack exchange,提问作者jrn
相关产品推荐
相关产品推荐

