【问题标题】:Callback url in angularjs with parameters for forgotpasswordangularjs中的回调url,带有forgotpassword的参数
【发布时间】:2015-12-30 03:21:39
【问题描述】:

尝试搜索互联网以找到解决方案,但现在几天都没有运气。我正在尝试使用 web api 实现忘记密码功能,但是在将重置电子邮件链接发送给用户后,我遇到了回调。

目前在我的控制器中我有

var callbackUrl = new Uri(Url.Link("ResetPasswordRoute", new { userId = cUser.Id, code = code }));

此回调将发送到用户的电子邮件。我希望用户单击此链接并为他打开一个重置页面,该页面还传递用户 ID 和代码。因此,输入新密码的视图。一旦他们提交,我希望它会进入我的 httpGet resetPassword 方法,代码、用户 ID 和新密码如下所示。

 [HttpGet]
    [Route("ResetPassword", Name = "ResetPassword")]
    public async Task<IHttpActionResult> ResetPassword(string userId = "", string code = "")
    {
        if (string.IsNullOrWhiteSpace(userId) ||        string.IsNullOrWhiteSpace(code))
        {
            ModelState.AddModelError("", "User Id and Code are required");
            return BadRequest(ModelState);
        }
        IdentityResult result = await _repo.ResetPasswordRoute(userId,code);

        if (result.Succeeded)
        {
            return Ok();
        }
        else
        {
            return GetErrorResult(result);
        }
    }

所以问题是我真的很困惑我如何设置 ResetPasswordRoute 以在单击链接时在 webapi 中推送视图。以及 angularjs 如何捕获参数,因为 url 是一个阴影 url,因为它需要另一个路由页面。

我已经创建了一条路线:

}).when("/pages/reset", {
            templateUrl: "app/views/pages/reset-password.html"

我意识到我不能真正使用 $routeparameters。我已经阅读了大多数指南,但所有指南都是针对 MVC 的,它具有基于字符串代码的返回 View()!= null 并且 webapi 不使用 View()。任何帮助将不胜感激。

【问题讨论】:

    标签: asp.net angularjs url asp.net-web-api angularjs-routing


    【解决方案1】:

    我不熟悉 asp.net,但非常熟悉 Angular 和 REST API。希望这会有所帮助...

    在您的 Angular 应用程序中,您有一个供用户重置密码的链接。这应该使用 $http 调用您的 Web API,它会生成某种令牌并向用户发送电子邮件。

    应该由 API 生成 URL,其中将包括带有 userId 和重置令牌的路由或查询参数。比如:

    https://example.com/reset-password/123456/ABCDEF

    -或-

    https://example.com/reset-password?userId=123456&token=ABCDEF

    你的 Angular 应用应该有一个路由。假设您使用ngRoute,您的路由配置将如下所示:

    .when('/reset-password', {
      controller: 'ResetPasswordController',
      controllerAs: 'reset',
      templateUrl: 'path/to/template.html'
    })
    

    此路由的控制器应如下所示:

    function ResetPasswordController($http, $routeParams) {
      var reset = this;
      var userId = $routeParams.userId;
      var token = $routeParams.token;
    
      reset.submit = function(newPassword) {
        var data = {...};
        var config = {...};
        $http.post('https://api.example.com/reset-password', data, config)
          .then(function onSuccess(res) {...}, function onError(err) {...});
      };
    }
    

    当密码表单提交时,重置页面的模板会调用reset.submit()

    此时,您拥有了用户 ID、重置令牌和新密码。您需要决定是在 auth 标头、请求正文还是两者的某种组合中传递此信息。您还应该在 $http 配置中使用 withCredentials 选项。

    然后,此 Web API 端点需要验证令牌和用户 ID,如果有效则重置用户密码。

    如果 API 以 200 的状态码响应,您可以将用户重定向到登录页面。否则,处理错误。

    这能回答你的问题吗?

    【讨论】:

    • 关于 angularjs 部分的好答案。我暂时不考虑网站问题。所以我相信我正在查看 angularjs 部分,特别是路由。我注意到您在路由 .when 等中没有与用户 ID 或代码有关的任何内容。这是否意味着即使链接被散列,它仍然具有用户 ID 和代码属性,并且您可以访问重置密码视图?
    • 如果您使用 route 参数,即 userId 和 token 出现在 URL 中的斜杠之后,那么您将使用类似 .when('/reset-password/:userId/:token', {...}) 的内容。如果您使用 query 参数,即 ?userId=123&token=ABC,那么您只需使用 .when('/reset-password', {...})。无论哪种方式,参数都应该可以通过$routeParams 服务获得。
    • 我正在使用查询参数。所以我假设它将通过 $routeparameter 传递它。听起来不错。现在我只需要询问 url.link 的 webapi 部分是否需要重置密码的方法。我应该改用 url.route 吗?
    • 您不应该在客户端创建 URL。您的 API 应该生成 URL 并将其通过电子邮件发送给用户。当用户请求重置密码时将令牌传递回浏览器将完全绕过您的安全性。我只需要一个用户的电子邮件地址,当我请求为他们的帐户重置密码时,我只需检查网络流量就可以重置他们的密码。
    • 哦,是的,我说的是服务器端,请注意这种混乱。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    • 2021-08-09
    • 2014-09-16
    • 1970-01-01
    相关资源
    最近更新 更多