2

验证用户[这个问题涉及到ASP.NET MVC4,并且它是关于最佳实践方法 - 所以请,不建议黑客]在查询字符串身份验证令牌与ASP.NET MVC

我想使用请求URL中发送的身份验证令牌对用户进行身份验证。它的作用类似于密码重置令牌,除非在这种情况下它不会进入重置页面,而是授予对网站某些部分的访问权限。这个想法是将带有认证令牌的URL发送到用户的经过验证的电子邮件地址。用户可以单击链接并执行一些操作,而无需键入密码。

开箱即用,ASP.NET具有[Authorize]属性和SimpleMembershipProvider - 这些似乎很好,但他们在引擎盖下面做了一些巫术魔法(如自动生成数据库表),所以我不知道如何扩展它们来添加这个基于链接的身份验证令牌。

我不期待一个确切的答案,但请指点我正确的方向。

谢谢!

回答

2

Uf,广泛的问题。但我会尽量让你指引一个正确的方向。

因此,首先建议您使用Forms身份验证作为基础,但您必须自定义使用它。而且我认为您不希望使用Cookie进行身份验证,因为这是表单身份验证的本机行为。

最重要的一点你应该考虑让你自定义基于查询字符串令牌的身份验证。

  1. 创建登录的行动并在行动,你将授权用户,如果他授予你问FormsAuthentication创建AuthCookie访问。对于更进一步,你只需把httpCookie.Value作为你的认证令牌,你将携带在查询字符串中。

  2. 您需要实现Application_BeginRequestGlobal.asax将处理此查询字符串令牌和它翻译成cookie的。通过这种方法,您可以利用所有ASP.NET Forms身份验证基础结构。

这是相当高级别的图片没有代码。如果你需要更多的细节帮助,我也可以提供给你。

+0

谢谢 - 这是很好的建议,尽可能遵循形式。我如何区分真正的表单身份验证和基于链接的身份验证?基于链接的身份验证不应该提供与forms-auth相同的权限 - 例如,基于链接的身份验证用户不应该能够更改其密码或电子邮件地址。 – 2013-03-07 08:23:19

+0

你可以很容易地区分这一点。在Application_BeginRequest中,您将把查询字符串转换为cookie,您可以解密cookie,将自定义数据(如果用户身份验证来自查询字符串,将您的情况标志)放入勾号中,然后您可以阅读此处处理用户身份验证(例如操作过滤器)。有关自定义身份验证数据的更多信息:http://www.danharman.net/2011/07/07/storing-custom-data-in-forms-authentication-tickets/ – 2013-03-07 08:29:41

+0

呃......有趣。我会尝试的。 – 2013-03-07 17:57:13

1

您应该只使用常规Action,它接受HttpGet。 收到令牌后立即将其无效,因此无法再次使用。 此外,只接受在您预定义的时间范围内(如24或72小时)的令牌。

+0

我不想在控制器中处理认证。当您使用输出缓存时,存在一些问题。另一点 - 令牌需要持久 - 虽然没问题 - 它只授予对网站的有限访问权限(例如,用户无法仅使用此令牌更改密码或电子邮件) – 2013-03-07 08:07:03

+1

然后,您可以拥有两个处理程序。一个用于检查令牌(不输出缓存)并且一旦验证令牌,则重定向到另一个动作(输出缓存)。 – 2013-03-07 15:57:11