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

6
我使用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.");
                        }
                    }

很遗憾,我无法找到在Identity Server中读取这些参数的位置。这是可能的吗?

如果不支持或者完全错误,请指导处理此用例的最佳方法是什么?

1个回答

5
当传递自定义参数时,您应该使用OpenID Connect的可选参数acr_values。在这个链接中Identity Server已经使用了它来传递租户名称和身份提供者限制。 当您可以访问IdentityServer3.Core.Models.SignInMessage(例如在您的用户服务中)时,您可以在Identity Server中读取acr_values
更新(登出): acr_values不是退出登录的一部分。如果您真的想在这里获得自定义参数,则可以通过扩展DefaultViewService并重写LoggedOut方法来完成。
在此方法中,您可以查看SignOutMessageReturnUrl属性中的任何额外URL参数。
一旦您获得了值,就可以使用类似以下内容的方法将其添加到ViewModel中:
model.Custom = new { customMessage = "your value" };

接下来,您需要创建自己的模板用于注销页面,并将其显示为您的自定义值。

这并不美观也不好看。我不建议这样做,但确实是可能的...


谢谢您的输入。我看到 acr_values 可以覆盖在登录视图中显示某些内容的情况。那么当我需要传递一些信息到注销/已注销屏幕时呢?例如:“您的会话已过期,请尝试重新登录”。 - Kaspars Ozols
1
我更新了我的答案。如果你发现更好的方法或需要一些提到的概念的链接,请告诉我。 - Scott Brady
经过长时间的沉默,我终于决定实现它,但不幸的是失败了。似乎 SignOutMessageReturnUrl 不包含我在 ctx.ProtocolMessage.Parameters 中设置的任何额外参数。我应该如何设置它们?您编辑后的答案只涵盖了有关参数提取的部分,而没有涉及设置。 - Kaspars Ozols
据我所记,我将额外的值设置为一个新的 KeyValuePair<string, string> - Scott Brady

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接