首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在创建帐户后将用户返回到应用程序

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

Stack Overflow用户
提问于 2018-08-22 08:23:55
回答 1查看 341关注 0票数 3

我有一个使用标识服务器4的身份服务器。当一个新用户注册时,我们向他们发送一封构象电子邮件。

代码语言:javascript
运行
复制
var callbackUrl = Url.EmailConfirmationLink(user.Id.ToString(), code, Request.Scheme);
            if (_emailSender.SendEmailConfirmation(model.Email, callbackUrl, out var errors))
                return RedirectToAction("CreateUserConfirmation");

发送给用户的url如下所示

ZyUZM63vHg6ntBBsm4CnbulgqDcECrjFCqpafiqw4gw&nonce=636705184638441890.ZjhkOTIz0NjAtNDRmZS00ODgwLWIwOWQtOWY2YWRkNTMwMTBhYmE4NjQ3MjYtMTllNS00ZWFlLWExMTEtYTRkNzQ2Y2JmYjFm

重定向回应用程序

当应用程序指向身份服务器以进行用户登录时,它将发送一个返回托辊。此url用于在用户登录后返回到应用程序。

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

这在现有用户中很好。

重定向新用户

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

添加返回托槽以确认电子邮件(我尝试过的)

我想要做的是把返程托儿所粘到确认网址上。因此,当用户确认他们的电子邮件时,他们会被路由回

代码语言:javascript
运行
复制
 public async Task<IActionResult> ConfirmEmail([FromQuery] string userId, [FromQuery] string code,[FromQuery]  string returnUrl = null)
    {
      ............

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

在电子邮件中发送的巨大的url看起来像这样

NoPVIFXY2ZSZKbhs4VxQ0HjJik4LGF0E2ToFAFDuonTJC3WwNSlFPN5eTrsbqebms-fqZq7dcpUOjhYU-kLpGcKSyaSXe5qr0EOanqIdEyV9H0EZolq38pjvBJWFf0bWC6KPNCZ4Nw&nonce=636705214204045725.YWI1YmVhNDQtYTE4MC00ZDIwLWJmMDQtYjA3YzNmMGYyODg3ZTNhNTNlMmEtNzQ1YS00M2Y4LWI2N2YtODY4MDg5OGNmYzNj

URL到long

问题是,当进入上述方法时,返回托儿是/connect/authorize/callback?client_id=XenaClient,它不是我要发送的完整url,我怀疑它太长,服务器无法解析?

问题

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-22 13:32:15

我终于开始工作了。当用户注册时,我有returnUrl,它包含redirect_uri。现在,我们假设应用程序位于相同的域和端口上。所以我把重定向的uri取出来。

代码语言:javascript
运行
复制
var pat = "redirect_uri=([^&]+)";
var r = new Regex(pat, RegexOptions.IgnoreCase);
var m = r.Match(returnurl);

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

代码语言:javascript
运行
复制
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中提取的域。

代码语言:javascript
运行
复制
return Redirect(returnUrl);

发行

现在,假设重定向uri和原始应用程序的主机位于同一个域中,这就可以工作了。据我所知,他们目前是。一个额外的结果是,如果他们试图在生产中使用本地主机重定向uri,这将导致重大问题,并且无法正确地重定向。这可能是一件好事,因为我希望第三方开发人员在生产中没有本地主机作为重定向uri。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51962664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档