当前位置: 首页 > 知识库问答 >
问题:

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

陶胤
2023-03-14

我有一个使用Identity server 4的Identity server。当新用户注册时,我们会向他们发送确认电子邮件

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

重定向回应用程序

当应用程序定向到身份服务器进行用户登录时,它会发送一个返回函数。此url用于在用户登录后返回应用程序

返回/连接/授权/回调?client_id=XenaClient

这在现有用户中运行良好。

重定向新用户

当新用户注册其帐户时,发送的电子邮件不会将其重定向回应用程序。它们被留在Identity server上。

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

我试图做的是将returnurl钉在确认url电子邮件上。因此,当用户确认他们的电子邮件时,他们会被路由回

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

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

邮件中发送的巨大网址是这样的

http://localhost:5000/Account/ConfirmEmail?userId=21248584

URL to long

问题是当它进入上面的方法时,返回URL是连接/授权/回调?client\u id=XenaClient我发送的完整url不是1457长,我怀疑对服务器来说太长而无法解析?

问题

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

共有1个答案

羊时铭
2023-03-14

我终于成功了。当用户注册时,我有一个返回URL,其中包含redirect\u uri。现在,我们假设应用程序位于同一个域和端口上。所以我去掉了重定向uri。

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

然后我可以把这个更小的uri添加到电子邮件混淆链接中

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。

如果有人有更好的解决方案,我仍然很乐意听到它,因为这感觉像一个轻微的黑客。但是我们需要尽快处理这个问题,所以我决定在找到更好的解决方案之前忍受黑客攻击

 类似资料:
  • 是否可以使用java代码创建/删除windows用户帐户并设置其权限以使其成为管理员帐户、简单用户帐户或来宾帐户?

  • 问题内容: 是否可以使用其他用户帐户在Windows上创建新进程?我知道有一个上下文菜单“运行方式”,但我想从Java中进行操作。我有用户名和密码。 问题答案: 您需要使用Java本机接口(JNI)编写DLL,因为您不能使用纯Java代码来执行此操作。 DLL本身需要调用 CreateProcessAsUser 函数在另一个用户的上下文中创建一个进程。要成功创建该过程,您需要提供对该函数的访问令牌

  • 问题内容: 我们正在为Joomla创建XML API,允许合作伙伴网站在我们的网站上为其用户创建新帐户。 我们已经创建了一个独立的PHP脚本来处理和验证API请求,但是现在我们需要实际创建新帐户。最初我们只是考虑进行CURL调用以提交注册表单,但是我们意识到用户令牌存在问题。是否有另一种干净的方法可以创建用户帐户而不用担心Joomla?如果我们必须做一些手术,最好的方法是什么? 问题答案: 您应该

  • 我正在使用mongodb社区版。我在mongodb中创建了一个用户。当使用该用户初始化配置时,该用户存在并且Vertx mongodb客户端成功启动。 var mongoconfig={“连接字符串”:mongodb://127.0.0.1:27017“,“db_name”:“admin”,“username”:“username”,“password”:“password”,“authSourc

  • 我正在尝试构建一个只有当前用户才能为新用户创建帐户的应用程序。我有两种用户医生和病人。只有医生才能为患者创建账户。到目前为止,Iv创建了一个Firebase数据库,它似乎正在工作,但现在已经停止。患者目前正在接受身份验证,但他们的信息没有被添加到数据库中。我认为问题在于在当前用户登录时尝试创建新用户。是否允许用户创建一个新用户,而无需作为新创建的用户登录? 此代码创建患者帐户并将其添加到Fireb

  • 我试图创建一个路由53记录集从帐户1在帐户2. 通过阅读其他帖子和在线搜索,我想做这样的事情: 想从有经验的人那里知道这是否是正确的方法吗?或者有没有更好的方法来实现上面? 更新代码如下: