我试图为Asp.Net MVC2应用程序实现基于令牌的授权,并且我认为我的方法是错误的。第一关:通过基于令牌的授权,我的意思是,当一个未经认证的用户进入http://myapp.com/some/action?tok=[special single-use token here]
他们在登录使用表单身份验证手动登录用户
所有在我的应用程序的控制器扩展了一个公共ApplicationController
,所以我的方法是到控制器上覆盖OnAuthorize
。如下:
class ApplicationController
{
protected override void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Request.QueryString["tok"] != null)
{
var token = HttpUtility.UrlDecode(filterContext.HttpContext.Request.QueryString["tok"]);
if ((var user = getUserByToken(token)) != null)
{
FormsAuthentication.SetAuthCookie(user.Email, false);
}
else{ /* highly-proprietary handling of invalid token */ }
}
base.OnAuthorization(filterContext);
}
}
我绝对肯定,当它应该和不被调用时,它不应该SetAuthCookie
被调用。
问题是,这并没有真正记录用户。它设置了一个cookie,这意味着我必须重定向(在调用SetAuthCookie
之后User.Identity.IsAuthenticated
仍然为false)。但是关于此的整个想法是继续请求正常并避免无意义的重定向。有什么方法可以实现这个目标吗?它似乎并不是一个很好的问...
有没有一种好的方法来设置User.Identity,基本上强制立即登录? – notJim 2010-12-15 20:53:02
我不想说有没有办法,因为我确定有(HttpContext.User可设置),但要做到完全正确,你会想做的一切,ASP.NET做的时候请求首先进入,如果是我,我会太担心某些东西会被遗漏。在我看来,重定向是最安全的选择。你可以重定向到同一个页面(也可以忽略查询字符串),它不必是一个不同的URL。 – 2010-12-15 20:57:35
因为基本上你所说的确保所有需要发生的事情,我现在就用重定向。看起来很奇怪,这样做没有什么不同。我想看看是否有其他答案进来,但如果没有,我想我会把它给雅:P。 – notJim 2010-12-15 21:49:56