我正在使用IdentityServer4,并且已经配置了OpenId Connect提供程序。我想做的是将用户名作为查询字符串的一部分传递给提供程序,以便提供程序预先填写用户名字段。我同时拥有ADFS和Azure AD提供程序,并且希望此功能可以同时使用。这可能吗?如果可以,怎么办?
在Challenge
的{{1}}方法中,我添加了我认为应该有效的方法,但它无能为力:
ExternalController
答案 0 :(得分:1)
您可以使用OnRedirectToIdentityProvider
类的OpenIdConnectEvents
属性来实现所需的目标:
在重定向到身份提供者进行身份验证之前调用。这可以用来设置ProtocolMessage.State,它将在身份验证过程中保留下来。 ProtocolMessage还可以用于添加或自定义发送给身份提供者的参数。
您可以通过AddOpenIdConnect
函数参与此过程,该函数在services.AddAuthentication
中使用Startup.ConfigureServices
时被调用。这是满足您要求的示例:
services
.AddAuthentication(...)
.AddOpenIdConnect(options =>
{
...
options.Events = new OpenIdConnectEvents
{
OnRedirectToIdentityProvider = ctx =>
{
if (ctx.HttpContext.Request.Query.TryGetValue("user", out var stringValues))
ctx.ProtocolMessage.LoginHint = stringValues[0];
return Task.CompletedTask;
}
};
});
其中大多数只是用于添加身份验证,OIDC以及为上述事件注册事件处理程序的样板代码。最有趣的部分是:
if (ctx.HttpContext.Request.Query.TryGetValue("user", out var stringValues))
ctx.ProtocolMessage.LoginHint = stringValues[0];
问题中的Challenge
操作从查询字符串参数中获取user
时,上面的代码从请求中读取了user
查询字符串参数(可能有更多而不是一个,这就是为什么我们在这里拥有StringValues
并将其设置为LoginHint
属性(如果找到)的原因。
注意:我已经使用https://demo.identityserver.io(当然可以)对其进行了测试。