将自定义参数传递给 Identity Server 3

Kas*_*ols 5 c# model-view-controller oauth-2.0 openid-connect identityserver3

我正在使用 Identity Server 3 + OpenID Connect + OAuth 2.0 在我的一个项目中实现单点登录。我已经根据提供的样本设置了所有内容,并且一切正常。我正在使用隐式流在多个 MVC 网站中对用户进行身份验证。

现在我有一个用例,当我需要将自定义参数从客户端应用程序传递到身份服务器时。最简单的示例之一是需要在 Identity Server 视图之一中显示的自定义消息。我想在不同的页面中呈现此消息 - 登录、注销、注销等。

我发现 Microsoft 的 OpenIdConnectAuthentication 中间件允许在 RedirectToIdentityProvider 通知中的 ProtocolMessage 中设置自定义参数。

例如,

 RedirectToIdentityProvider = async ctx =>
                {
                            ctx.ProtocolMessage.Parameters.Add("info_message", "Account activation succeeded. Please log in using new account.");
                        }
                    }
Run Code Online (Sandbox Code Playgroud)

不幸的是,我无法在 Identity Server 中找到可以读取这些参数的位置。这甚至可能吗?

如果这不受支持或完全错误,您能否建议处理此用例的最佳方法是什么?

Sco*_*ady 5

传入自定义参数时,您应该使用 OpenID Connect 可选参数acr_values。这已被 Identity Server用于传递租户名称和身份提供者限制。

acr_values只要您有权访问IdentityServer3.Core.Models.SignInMessage(例如在您的用户服务中),您就可以在 Identity Server 中阅读。

更新(退出)

acr_values不是注销的一部分。如果你真的想在这里获取自定义参数,可以通过扩展DefaultViewService和覆盖LoggedOut方法来完成。

在此方法中,您可以在SignOutMessageReturnUrl属性中看到任何额外的 URL 参数。

获得值后,您可以使用以下内容将其添加到 ViewModel:

model.Custom = new { customMessage = "your value" };
Run Code Online (Sandbox Code Playgroud)

然后,您需要为注销页面创建自己的模板,并让它显示您的自定义值。

这不好看也不漂亮。我不会推荐它,但它肯定是可能的......