我想生成重置密码链接以发送到用户的电子邮件,该电子邮件将打开ResetPassword页面。在此页面上,我将填写有关新密码的详细信息,然后确认密码。
为此我遵循了Link
但是我的web api项目中找不到Url.Action方法。
var callbackUrl = Url.Action(
"ConfirmEmail", "Account",
new { userId = user.Id, code = code },
protocol: Request.Url.Scheme);
激活任何人在网络API中完成重置密码部分?我需要一些帮助。
答案 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);
}
}
Url.Action:
public class HomeController : Controller
{
public ActionResult Index()
{
ViewBag.Title = $"Url Created: {Url.Action("Index", "Home", "", Request.Url.Scheme)}";
return View();
}
}
我也在这里证明了这一点:
关于主机头攻击的更多内容:
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方法的来源: