【问题标题】:IdentityServer4 how to deal with returnUrlIdentityServer4如何处理returnUrl
【发布时间】:2020-04-21 16:33:27
【问题描述】:

我们的高级开发人员最近离开了我们,我正试图游入 IdentityServer 的海洋。

有几件事我不明白,也找不到相关信息。 例如,当您运行客户端应用程序时,它会重定向到 IdentityServer/Account/Login,并带有一个名为 returnUrl 的参数。

returnUrl 似乎有很多用途,例如使用以下命令检索授权上下文:

await _interaction.GetAuthorizationContextAsync(returnUrl);

我的第一个问题是:

returnUrl 是从哪里来的?它是如何/在哪里创建的?

第二个问题是:

有没有办法在您登录后将其存储在客户端应用程序中的某个位置? 我的意思是,在客户端应用程序中,我们必须发送邮件来创建新帐户。 这些邮件将新用户重定向到 IdentityServer 的“注册”页面。 我想做的是让 returnUrl 在这里将新用户重定向到正确的客户端应用程序。

感谢您的宝贵时间!

编辑:

这是在我的客户端(在 IdentityServer 中)设置的返回 url:

RedirectUris = {"http://localhost:44349" + "/signin-oidc"}

这是我启动客户端应用程序时 IdentityServer 中的 Login 方法收到的 returnUrl

"/connect/authorize/callback?client_id=MyApplication_Web&redirect_uri=http%3A%2F%2Flocalhost%3A44349%2Fsignin-oidc&response_type=code%20id_token&scope=openid%20offline_access%20roles%20Cri_Identity_Serveur_Api.Full_Access&response_mode=form_post&nonce=637230882720491348.YmQzODA4ZTQtNDczZS00OWYwLWFmNmEtYjA2NmQ3YmIwZjg2YzdiODk4ZDYtMTU1YS00ZTM0LWE0MGEtNDVjOWNkZWFiYTM1&state=CfDJ8Ly2XCz96vdGkR4YQuJ4jeE-v9P4l1W7fLWpJcCGZpt1rMpXyWqEGdnaeRZfiZy4M4Z79LcixUbo06zImhsxwbgyV4hK82qmn0mI6wkrxwraT1tH3XNCdSXCfUJqwk_hZguMSwspZDEN6r1WxnZsU9kT8MHrb9qpzsMOMzsotVzToEjgMtxIeoRfqFSoK8ZfUXBkSw__qxVyIe1lCs96-I--ufZSyO2pBe2kfau-ah7eR5-9oopxX6x1k0tzFHAk6Y3_jMqGysES_GmmfeUJvXXFIR35Rc-IaxU1igswmL2h1IUS-0DQ98Tv_Gf3hirnS87SU87aSJhajgn2YmARXWc&x-client-SKU=ID_NETSTANDARD2_0&x-client-ver=5.3.0.0"

似乎要使用await _interaction.GetAuthorizationContextAsync(returnUrl); 检索自动化上下文,returnUrl 必须是带有"/connect/authorize/callback?..." 的整个网址

【问题讨论】:

    标签: asp.net-core identityserver4


    【解决方案1】:

    不幸的是 Martin 的回答不正确 - 在这种情况下,returnUrl 是客户端最初请求的授权端点 URL。如果用户未通过身份验证,则该端点将重定向到您指定的登录 UI 端点并包含此参数。 GetAuthorizationContextAsync() 只是分析该 URL,如果它与授权端点 URL 的签名匹配,那么它将解析、验证并返回一个代表该原始请求的对象。然后,您可以根据该信息自定义您的登录流程(例如,显示您正在登录的客户的名称或限制可用的社交登录方法或任何数量的其他内容)。

    您可以在您的注册流程中包含此 URL,但我个人更喜欢基于一次性代码的电子邮件验证流程,这意味着用户不会丢失上下文,例如登录本地移动应用程序,并且在他们注册的设备上也不需要电子邮件客户端 - 例如无法访问其工作电子邮件帐户的电话。不过每个人的要求都不一样。

    【讨论】:

    • 感谢您的详细解答。它有助于更​​好地理解 returnUrl 的事情:)
    【解决方案2】:

    returnUrl 是从哪里来的?它是如何/在哪里创建的?

    调用 Identity Server 的客户端将返回 URL 指定为 redirect_uri。是回调地址。

    客户端在 Identity Server 中进行配置,并为每个配置的客户端配置一个允许的重定向 URI 列表,以使用 Client 类的 RedirectUris 属性返回令牌或授权代码。配置位于名为Config 的类中,该类具有GetClients 方法。

    public class Config
    {
        public static IEnumerable<Client> GetClients(IdentityServerAppSettings settings)
        {
            return new[]
            {
                new Client
                {
                    ClientId = "roivenue-frontend",
                    RedirectUris = new [] { "https://myappurl/somepage.html" }, // list of allowed URLs
                    ...
                },
    

    如果客户端发送的redurect_uri地址与任何配置的地址都不匹配,则Identity Server中的请求验证失败。

    有没有办法在您登录后将其存储在客户端应用程序中的某个位置?

    回调地址在您正在开发的客户端应用程序中。它可以是 Identity Server 已知的任何地址,具有上述配置。

    【讨论】:

    • 所以,如果我理解正确,如果我的Client 设置为这样`RedirectUris = {"my-url-here" + "/signin-oidc"},_interaction.GetAuthorizationContextAsync(returnUrl) 将只工作如果它收到相同的网址,对吗?我只是不明白调用 IdentityServer 时客户端应用程序中的回调地址是如何生成的......
    • 是的,没错。您的客户端应用程序是什么,是 javascript 客户端还是其他应用程序?对于 javascript 客户端,它很简单,将位置更改为授权端点 - 描述为 here。
    • 刚刚编辑了原始帖子以添加在 IdentityServer Client 中配置的地址,以及在我运行客户端应用程序时传递给 Login 方法的地址。我可以看到地址存储在redirect_uri=,但这是否意味着如果我这样做await _interaction.GetAuthorizationContextAsync("http://localhost:44349" + "/signin-oidc");,它会给我正确的授权上下文?
    • 我的客户端是一个asp-net core mvc应用程序
    • this post 的答案表明 IdentityServer 是用于验证现有用户,而不是真正创建新用户。在此解决方案中,通过调用 API 创建用户,该 API 在身份提供者中创建适当的结构。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多