2010-12-15 60 views
0

我试图为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)。但是关于此的整个想法是继续请求正常并避免无意义的重定向。有什么方法可以实现这个目标吗?它似乎并不是一个很好的问...

回答

0

在你调用SetAuthCookie之后,User.Identity没有任何变化。在下一次请求中,数据将成为您所期望的。这里要做的最好的事情是在SetAuthCookie被调用后发出重定向。

+0

有没有一种好的方法来设置User.Identity,基本上强制立即登录? – notJim 2010-12-15 20:53:02

+0

我不想说有没有办法,因为我确定有(HttpContext.User可设置),但要做到完全正确,你会想做的一切,ASP.NET做的时候请求首先进入,如果是我,我会太担心某些东西会被遗漏。在我看来,重定向是最安全的选择。你可以重定向到同一个页面(也可以忽略查询字符串),它不必是一个不同的URL。 – 2010-12-15 20:57:35

+0

因为基本上你所说的确保所有需要发生的事情,我现在就用重定向。看起来很奇怪,这样做没有什么不同。我想看看是否有其他答案进来,但如果没有,我想我会把它给雅:P。 – notJim 2010-12-15 21:49:56

相关问题