代码之家  ›  专栏  ›  技术社区  ›  Linda Lawton - DaImTo

如何在创建帐户后将用户返回到应用程序

  •  3
  • Linda Lawton - DaImTo  · 技术社区  · 8 年前

    var callbackUrl = Url.EmailConfirmationLink(user.Id.ToString(), code, Request.Scheme);
                if (_emailSender.SendEmailConfirmation(model.Email, callbackUrl, out var errors))
                    return RedirectToAction("CreateUserConfirmation");
    

    发送给用户的url如下所示

    http://localhost:5000/Account/ConfirmEmail?userId=21248584&code=CfDJ8Fjc0B4fXChAiNkOxmI4n6Tm8kxBYVt59xoQ7QqEiE8EdPVknVaQaMq7HACmGUGANjSc6LY0OjvWye%2BcZB8J9YMgB84uCsPRTRzno2W%2B1XtHsYD7zn%2FzZSxhCObppyj2ezPbY7O8wa18a0gvfqrHB2jEWjOxX2eauZkvRUvjxYGBIch0dN8A94VgO7qbTssmcsbI3kbSAmAP4a4%2B05iVK2Y%3D&returnUrl=/connect/authorize/callback?client_id=XenaClient&redirect_uri=http%3A%2F%2Flocalhost%3A49000%2Fsignin-oidc&response_mode=form_post&response_type=id_token%20token%20code&scope=openid%20profile%20testapi&state=OpenIdConnect.AuthenticationProperties%3DoJ7JIbKOpJI6pQuFrpY7YmrqyU2x-8TbuBM_d2XOTdZZZAMYW_RXfckkwDI-G88UkChcDlxYKmpba688bTKUt7VMKPz6Js8dQtyE2goLJASrSLmItXbynP0XC4o7DiM9FQQ_HcsB6vtX4tGFNvFfmAascO_ZyUZM63vHg6ntBBsm4CnbulgqDcECrjFCqpafiqw4gw&nonce=636705184638441890.ZjhkOTIz0NjAtNDRmZS00ODgwLWIwOWQtOWY2YWRkNTMwMTBhYmE4NjQ3MjYtMTllNS00ZWFlLWExMTEtYTRkNzQ2Y2JmYjFm

    当应用程序指向Identity server进行用户登录时,它会发送一个returnurl。此url用于在用户登录后将其返回到应用程序

    returnurl=/connect/authorize/callback?客户端id=XenaClient&redirect\u uri=http%3A%2F%2localhost%3A49000%2Fsignin oidc&response\u mode=form\u post&response\u type=id\u token%20token%20code&scope=openid%20profile%20testapi&国家=OpenIdConnect.AuthenticationProperties%3Duqw4onaEn-5tgyhvg5nqnrpvzycc8y12c5vtherqlvi5y6gzzgjcsuptx_nopvixy2zkbhs4vxq0hjjk4lgf0e2tofafduuntjc3wwnslfpn5etrsbqebms-fqzq7dcpuojyu-klpgcksyasxe5qr0eoanqidevyv9h0ezolq38pjvbjwf0bwc6kpnc4nw&nonce=636705214204045725.ywi1ymvhndqtyte4mc00zdiwlwjmmdqtyja3yznmgyyodg3ztnntnlmmetnzq1ys002y4lwi2nytyd4mdg5ognmyznj

    这对现有用户很有用。

    当新用户注册他们的帐户时,他们发送的电子邮件不会将他们重定向回应用程序。它们被留在身份服务器上。

    添加returnurl以确认电子邮件(我尝试了什么)

     public async Task<IActionResult> ConfirmEmail([FromQuery] string userId, [FromQuery] string code,[FromQuery]  string returnUrl = null)
        {
          ............
    
         return (returnUrl == null)
                ? RedirectToAction("Login")
                : RedirectToLocal(returnUrl);
        }
    

    电子邮件中发送的巨大url如下所示

    http://localhost:5000/Account/ConfirmEmail?userId=21248584&code=CfDJ8Fjc0B4fXChAiNkOxmI4n6Tm8kxBYVt59xoQ7QqEiE8EdPVknVaQaMq7HACmGUGANjSc6LY0OjvWye%2BcZB8J9YMgB84uCsPRTRzno2W%2B1XtHsYD7zn%2FzZSxhCObppyj2ezPbY7O8wa18a0gvfqrHB2jEWjOxX2eauZkvRUvjxYGBIch0dN8A94VgO7qbTssmcsbI3kbSAmAP4a4%2B05iVK2Y%3D&returnUrl=/connect/authorize/callback?client_id=XenaClient&redirect_uri=http%3A%2F%2Flocalhost%3A49000%2Fsignin-oidc&response_mode=form_post&response_type=id_token%20token%20code&scope=openid%20profile%20testapi&state=OpenIdConnect.AuthenticationProperties%3DoJ7JIbKOpJI6pQuFrpY7YmrqyU2x-8TbuBM_d2XOTdZZZAMYW_RXfckkwDI-G88UkChcDlxYKmpba688bTKUt7VMKPz6Js8dQtyE2goLJASrSLmItXbynP0XC4o7DiM9FQQ_HcsB6vtX4tGFNvFfmAascO_ZyUZM63vHg6ntBBsm4CnbulgqDcECrjFCqpafiqw4gw&nonce=636705184638441890.ZjhkOTIz0NjAtNDRmZS00ODgwLWIwOWQtOWY2YWRkNTMwMTBhYmE4NjQ3MjYtMTllNS00ZWFlLWExMTEtYTRkNzQ2Y2JmYjFm&returnurl=/connect/authorize/callback?client_id=XenaClient&redirect_uri=http%3A%2F%2Flocalhost%3A49000%2Fsignin-oidc&response_mode=form_post&response_type=id_token%20token%20code&scope=openid%20profile%20testapi&state=OpenIdConnect.AuthenticationProperties%3Duqw4onaEn-5TgYhVg5nQnRpvZYC1C8y12c5VTheRQlVI5y6GzTzgJCsuPTx_NoPVIFXY2ZSZKbhs4VxQ0HjJik4LGF0E2ToFAFDuonTJC3WwNSlFPN5eTrsbqebms-fqZq7dcpUOjhYU-kLpGcKSyaSXe5qr0EOanqIdEyV9H0EZolq38pjvBJWFf0bWC6KPNCZ4Nw&nonce=636705214204045725.YWI1YmVhNDQtYTE4MC00ZDIwLWJmMDQtYjA3YzNmMGYyODg3ZTNhNTNlMmEtNzQ1YS00M2Y4LWI2N2YtODY4MDg5OGNmYzNj

    长URL

    问题是当它进入上述方法时,returnurl是 /connect/authorize/callback?client_id=XenaClient

    问题

    因此,如果请求太长,如何将用户返回到应用程序。请注意,将其默认为单个url是行不通的,因为我们有多个应用程序使用此identity server,并且无法知道用户最初来自哪个应用程序。

    1 回复  |  直到 8 年前
        1
  •  0
  •   Linda Lawton - DaImTo    8 年前

    我终于开始工作了。当用户注册时,我有returnUrl,它包含重定向uri。现在我们假设应用程序在同一个域和端口上。所以我去掉了重定向uri。

    var pat = "redirect_uri=([^&]+)";
    var r = new Regex(pat, RegexOptions.IgnoreCase);
    var m = r.Match(returnurl);
    

    public static string EmailConfirmationLink(this IUrlHelper urlHelper, string userId, string code, string scheme, string returnUrl = "")
        {
            return urlHelper.Action(
                action: nameof(AccountController.ConfirmEmail),
                controller: "Account",
                values: new { userId, code, returnUrl },
                protocol: scheme);
        }
    

    当用户点击链接时,我会确认他们的电子邮件,并将其重新路由回我从重定向uri中提取的域

    return Redirect(returnUrl);
    

    推荐文章