生成 link in controller to send in email

问题描述 投票:0回答:2

我正在实现一个密码重置系统,虽然代码工作正常,但是对用户来说存在一个小问题。该系统通过生成通过电子邮件发送的一次性加密安全令牌来工作。问题是,要使用这些令牌,用户必须单击他们收到的电子邮件中的链接。这本身不是问题,但有问题的链接看起来像这样:

http://www.example.com/Account/ResetPassword/184?t=BC2EveZtRl3wjbONboalzlUVwUpp%252BYaiKvbsZ6aPPYE%253D

用户不愿意点击此链接,因为它很大且看起来很吓人;他们认为这是一个恶意的第三方窃取他们的密码或给他们一个病毒或东西的伎俩。

如果这是一个视图,我会使用@Html.ActionLink()生成一个漂亮的<a>链接,上面写着“点击这里重设你的密码”,这没关系。但是,在控制器中,我无法访问该方法,除非我实例化HtmlHelper,这需要ViewData,这导致需要实例化的整个链条以伪造一些我不会使用的东西我看过的每个地方都说这是不好的做法,我不应该这样做。

在ASP.NET MVC中,在控制器代码中生成一个简洁的<a>链接的最简洁方法是什么?

html asp.net-mvc-4 hyperlink asp.net-core-2.0 asp.net-mvc-routing
2个回答
5
投票

UrlHelper可以通过Url属性在控制器中获得,它可以做同样的事情,那就是为你建立一个URL。因此,您可以向电子邮件发件人提供包含链接的文本,这就是您构建电子邮件的这一部分的方式:

var link = "<a href='http://www.mysite.com/" 
    + @Url.Action("ResetPassword","Account", new{id=184, t=token}) 
    +"'>Click here to reset your password</a>"
// where token is your single-use crypto-secure

如果您希望域是动态的,那么您可以将其更改为:

var link = "<a href='" 
    + Request.Url.Scheme + "://"
    + Request.Url.Authority
    + @Url.Action("ResetPassword","Account", new{id=184, t=token}) 
    +"'>Click here to reset your password</a>"
// where token is your single-use crypto-secure

0
投票

如果您使用的是Asp.NET Core 2.0或更高版本,则可以使用Url.Page()方法生成链接。

var link = Url.Page("/Account/ResetPassword", new{id=184, t=token}, Request.Scheme);
© www.soinside.com 2019 - 2024. All rights reserved.