在Web Api中生成重置密码链接

时间:2014-06-13 10:53:09

标签: asp.net asp.net-web-api asp.net-web-api2

我想生成重置密码链接以发送到用户的电子邮件,该电子邮件将打开ResetPassword页面。在此页面上,我将填写有关新密码的详细信息,然后确认密码。

为此我遵循了Link

但是我的web api项目中找不到Url.Action方法。

var callbackUrl = Url.Action(
               "ConfirmEmail", "Account", 
               new { userId = user.Id, code = code }, 
               protocol: Request.Url.Scheme);

激活任何人在网络API中完成重置密码部分?我需要一些帮助。

5 个答案:

答案 0 :(得分:6)

您可以在Web API 2.0中使用Url.Link

var callbackUrl = Url.Link("Default", new { Controller = "Account", 
                  Action = "ConfirmEmail", userId = user.Id, code = code });

答案 1 :(得分:1)

Url.Action不存在,因为WebApi doe snot中的Url助手具有Action方法。您可以使用Url.Route生成相同的内容,但您需要创建一个命名路由才能使用该方法。如果您使用属性路由,则可以为路由属性添加名称,如下所示:

[Route(Name="ConfirmEmail")]

并且助手将是

var callbackUrl = Url.Route("ConfirmEmail", new { userId = user.Id, code = code });

答案 2 :(得分:0)

请尝试以下操作:

var code = await UserManager.GeneratePasswordResetTokenAsync(user.Id);
        var callbackUrl = Url.Action("ResetPassword", "Account", 
        new { UserId = user.Id, code = code }, protocol: Request.Url.Scheme);
        await UserManager.SendEmailAsync(user.Id, "Reset Password", 
        "Please reset your password by clicking here: <a href=\"" + callbackUrl + "\">link</a>");        
        return View("ForgotPasswordConfirmation");

有关更多信息,请参阅link

答案 3 :(得分:0)

我创建了一个简单的“更改密码”表单,我根据我的webAPI应用程序中的菜单点击进行管理。在此表单的更新处理程序上,我创建了以下事件处理程序。这只是调用VS2013 WebAPI模板附带的AccountController Web服务。此示例启用了身份验证,并记下要用于在AccountController方法中包含已定义路由的特定URL。

在WebAPI模板中生成的AccountController类中查找ChangePassword()方法,以查看调用的内容。我认为这应该回答你的基本问题。

import matplotlib.pyplot as plt

}

答案 4 :(得分:0)

在我看来,您不应该使用Url.Link()Url.Action()向用户发送内容而不自行设置主机。您将它们暴露给可能的Host Header Attack -> Password Reset Poisoning

如果IIS具有接受80/443上的连接的绑定,则可以更改主机头,从而影响Url.Link()Url.Action()方法。如果您查看我正在下面的请求,我正在连接到http://hostheaderattack,但操纵host标题。

概念证明(PoC):

Url.Link:

public class TestController : ApiController
{
    public IHttpActionResult Get()
    {
        var callbackUrl = Url.Link("Default", new
        {
            Controller = "Home",
            Action = "Index",
        });

        return Ok(callbackUrl);
    }
}

enter image description here

Url.Action:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewBag.Title = $"Url Created: {Url.Action("Index", "Home", "", Request.Url.Scheme)}";

        return View();
    }
}

enter image description here

我也在这里证明了这一点:

https://security.stackexchange.com/questions/170755/host-header-attack-password-reset-poisoning-asp-net-web-api-2-hosted-as-az/170759#170759

关于主机头攻击的更多内容:

https://www.acunetix.com/blog/articles/automated-detection-of-host-header-attacks/

您应该做的是永远不要相信用户请求并手动构建带有主机的URL。

手动主机名示例:

Url.Action:Url.Action("Index", "Home", null, Request.Url.Scheme, "example.com")

对于Url.Link来说,它有点棘手,但可以这样做:

public class TestController : ApiController
{
    // GET api/<controller>
    public IHttpActionResult Get()
    {
        var callbackUrl = Url.Link("Default", new
        {
            Controller = "Home",
            Action = "Index",
        });

        callbackUrl = ReplaceHost(callbackUrl, "example.com");

        return Ok(callbackUrl);
    }

    private string ReplaceHost(string original, string newHostName)
    {
        var builder = new UriBuilder(original);
        builder.Host = newHostName;
        return builder.Uri.ToString();
    }
}

ReplaceHost方法的来源:

https://stackoverflow.com/a/479812/3850405