繁体   English   中英

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

[英]How to return a user to application after account creation

我有一个使用身份服务器4的身份服务器。当一个新用户注册时,我们会向他们发送一封确认邮件

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

发送给用户的网址如下所示

HTTP://本地主机:5000 /帐户/ ConfirmEmail用户id = 21248584&代码= CfDJ8Fjc0B4fXChAiNkOxmI4n6Tm8kxBYVt59xoQ7QqEiE8EdPVknVaQaMq7HACmGUGANjSc6LY0OjvWye%2BcZB8J9YMgB84uCsPRTRzno2W%2B1XtHsYD7zn%2FzZSxhCObppyj2ezPbY7O8wa18a0gvfqrHB2jEWjOxX2eauZkvRUvjxYGBIch0dN8A94VgO7qbTssmcsbI3kbSAmAP4a4%2B05iVK2Y%3D&RETURNURL = /连接/授权/回调的client_id = XenaClient&REDIRECT_URI = HTTP%3A%2F%2Flocalhost%3A49000%2Fsignin? -oidc&response_mode = form_post&RESPONSE_TYPE = id_token%20token%20code&范围=的OpenID%20profile%20testapi&状态= OpenIdConnect.AuthenticationProperties%3DoJ7JIbKOpJI6pQuFrpY7YmrqyU2x-8TbuBM_d2XOTdZZZAMYW_RXfckkwDI-G88UkChcDlxYKmpba688bTKUt7VMKPz6Js8dQtyE2goLJASrSLmItXbynP0XC4o7DiM9FQQ_HcsB6vtX4tGFNvFfmAascO_ZyUZM63vHg6ntBBsm4CnbulgqDcECrjFCqpafiqw4gw&随机数= 636705184638441890.ZjhkOTIz0NjAtNDRmZS00ODgwLWIwOWQtOWY2YWRkNTMwMTBhYmE4NjQ3MjYtMTllNS00ZWFlLWExMTEtYTRkNzQ2Y2JmYjFm

重定向回应用程序

当应用程序指向Identity Server以进行用户登录时,它会向其发送returnurl。 此URL用于在用户登录后将其返回给应用程序

RETURNURL = /连接/授权/回调?CLIENT_ID = XenaClient&REDIRECT_URI = HTTP%3A%2F%2Flocalhost%3A49000%2Fsignin-OIDC&response_mode = form_post&RESPONSE_TYPE = id_token%20token%20code&范围=的OpenID%20profile%20testapi&状态= OpenIdConnect.AuthenticationProperties%3Duqw4onaEn-5TgYhVg5nQnRpvZYC1C8y12c5VTheRQlVI5y6GzTzgJCsuPTx_NoPVIFXY2ZSZKbhs4VxQ0HjJik4LGF0E2ToFAFDuonTJC3WwNSlFPN5eTrsbqebms-fqZq7dcpUOjhYU -kLpGcKSyaSXe5qr0EOanqIdEyV9H0EZolq38pjvBJWFf0bWC6KPNCZ4Nw&随机数= 636705214204045725.YWI1YmVhNDQtYTE4MC00ZDIwLWJmMDQtYjA3YzNmMGYyODg3ZTNhNTNlMmEtNzQ1YS00M2Y4LWI2N2YtODY4MDg5OGNmYzNj

这适用于现有用户。

重定向新用户

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

添加returnurl以确认电子邮件(我试过的)

我试图做的是将returnurl添加到确认网址电子邮件中。 因此,当用户确认他们的电子邮件时,他们将被路由回来

 public async Task<IActionResult> ConfirmEmail([FromQuery] string userId, [FromQuery] string code,[FromQuery]  string returnUrl = null)
    {
      ............

     return (returnUrl == null)
            ? RedirectToAction("Login")
            : RedirectToLocal(returnUrl);
    }

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

HTTP://本地主机:5000 /帐户/ ConfirmEmail用户id = 21248584&代码= CfDJ8Fjc0B4fXChAiNkOxmI4n6Tm8kxBYVt59xoQ7QqEiE8EdPVknVaQaMq7HACmGUGANjSc6LY0OjvWye%2BcZB8J9YMgB84uCsPRTRzno2W%2B1XtHsYD7zn%2FzZSxhCObppyj2ezPbY7O8wa18a0gvfqrHB2jEWjOxX2eauZkvRUvjxYGBIch0dN8A94VgO7qbTssmcsbI3kbSAmAP4a4%2B05iVK2Y%3D&RETURNURL = /连接/授权/回调的client_id = XenaClient&REDIRECT_URI = HTTP%3A%2F%2Flocalhost%3A49000%2Fsignin? -oidc&response_mode = form_post&RESPONSE_TYPE = id_token%20token%20code&范围=的OpenID%20profile%20testapi&状态= OpenIdConnect.AuthenticationProperties%3DoJ7JIbKOpJI6pQuFrpY7YmrqyU2x-8TbuBM_d2XOTdZZZAMYW_RXfckkwDI-G88UkChcDlxYKmpba688bTKUt7VMKPz6Js8dQtyE2goLJASrSLmItXbynP0XC4o7DiM9FQQ_HcsB6vtX4tGFNvFfmAascO_ZyUZM63vHg6ntBBsm4CnbulgqDcECrjFCqpafiqw4gw&随机数= 636705184638441890.ZjhkOTIz0NjAtNDRmZS00ODgwLWIwOWQtOWY2YWRkNTMwMTBhYmE4NjQ3MjYtMTllNS00ZWFlLWExMTEtYTRkNzQ2Y2JmYjFm&RETURNURL = /连接/授权/回调?CLIENT_ID = XenaClient&REDIRECT_URI = HTTP%3A%2F%2Flocalhost% 3A49000%2Fsignin-OIDC&respons e_mode = form_post&RESPONSE_TYPE = id_token%20token%20code&范围=的OpenID%20profile%20testapi&状态= OpenIdConnect.AuthenticationProperties%3Duqw4onaEn-5TgYhVg5nQnRpvZYC1C8y12c5VTheRQlVI5y6GzTzgJCsuPTx_NoPVIFXY2ZSZKbhs4VxQ0HjJik4LGF0E2ToFAFDuonTJC3WwNSlFPN5eTrsbqebms-fqZq7dcpUOjhYU-kLpGcKSyaSXe5qr0EOanqIdEyV9H0EZolq38pjvBJWFf0bWC6KPNCZ4Nw&随机数= 636705214204045725.YWI1YmVhNDQtYTE4MC00ZDIwLWJmMDQtYjA3YzNmMGYyODg3ZTNhNTNlMmEtNzQ1YS00M2Y4LWI2N2YtODY4MDg5OGNmYzNj

URL为long

问题是当它进入上面的方法时returnurl是/connect/authorize/callback?client_id=XenaClient这不是我发送的完整网址1457很长,我怀疑服务器解析时间太长了?

那么如果请求太长,如何将用户返回到应用程序。 注意将它默认为单个URL不会工作,因为我们有几个使用此身份服务器的应用程序,并且无法知道用户最初来自哪个应用程序。

我终于搞定了这个。 当用户注册时我有returnUrl,其中包含redirect_uri。 现在我们假设应用程序位于同一个域和端口上。 所以我撕掉了重定向uri。

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

然后我可以将这个较小的uri添加到电子邮件confromation链接

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);

问题

现在假设重定向uri和原始应用程序的主机位于同一个域上,这应该可行。 据我所知,他们目前是。 奖金结果将是,如果他们试图在生产中使用localhost重定向uri,它将导致重大问题而无法正确重定向。 这可能是一件好事,因为我宁愿第三方开发人员没有localhost作为生产中的重定向uri。

如果有人有更好的解决方案,我仍然希望听到它,因为这感觉就像一个轻微的黑客。 但我们需要尽快解决这个问题,所以我决定忍受黑客攻击,直到我们找到更好的解决方案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM