User.Isauthenticated在ASP mvc中随机工作

时间:2014-07-19 09:42:15

标签: asp.net-mvc asp.net-mvc-4 c#-4.0

我正在尝试确保我的用户log in作为elementryUser .So在登录控制器中检查usernamepassword,如果身份验证为真,用户可以进入下面给出的代码处理页面:(这部分代码是登录操作)

FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
System.Threading.Thread.Sleep(10000);
   if (User.IsInRole("ElementryUser"))
     {
        int UserId = objuserrepository.FindBy(i => i.Email == User.Identity.Name).First().Id;
        if (firstIdeaRepository.FindBy(i => i.UserId == UserId).Count() > 0)
          {
            return RedirectToAction("Index", "FirstIdea");
          }

     }
   else
    {
      return RedirectToAction("Index", "Dashboard");
    }

正如您可以看到usernamepassword是否为真,Cookie已初始化,在此行中if (User.IsInRole("ElementryUser"))当我想检查我的用户权限但它没有工作,它没有执行if statement。所以我跟踪代码,我发现User.Isauthenticated返回false !!!!为什么?问题是什么?所以我把和这两行之间的线程,因为我认为也许线程可以解决问题。但是它没有工作User.Isauthenticated返回false并且有时会返回true并且当它返回true时if statement有效。!!

祝你好运

3 个答案:

答案 0 :(得分:2)

我在这里回答一般,因为我不能回答你的问题。我只能给你一些指导方针,可能会继续前进。

正如您所知,身份验证与一个cookie相关联。 因此,如果cookie没有被加入,那么用户就不会被认证,除了可以被加入的事实,而不是出于其他原因进行身份验证。

如果您设置了一页的cookie,则无法呈现,您可以查看以下原因:

  1. 当您从https移至http页时,Cookie仅针对安全页面设置。
  2. 当您从example.com移至www.example.comwhatevet.example.com
  3. 当您设置cookie时,但在将cookie传输到客户端之前进行重定向。
  4. 在web.config上,您可以在此行上设置1和2.

    <authentication mode="Forms">
      <forms name=".auth" 
             path="/" 
             requireSSL="false" 
             cookieless="UseCookies" 
             domain="example.com" 
             enableCrossAppRedirects="false" />
    </authentication>
    

    设置路径,requireSSL和域,没有子域名设置cookie在您的网站上随处可见。

    现在,如果您离开requireSSL="false",中间人可以阅读cookie并在被盗时登录您的网站。相关:Can some hacker steal the cookie from a user and login with that name on a web site?

答案 1 :(得分:1)

FormsAuthentication.SetAuthCookie(model.UserName,model.RememberMe);只设置 cookie ,它不会在当前请求上下文中设置IPrincipal(“User”是当前请求IPrincipal的快捷方式)。
在用户向服务器发出的下一个请求上,浏览器将发送cookie,然后FormsAuthentication模块将读取该cookie并在当前请求上下文中设置IPrincipal。

换句话说,做一些像

这样的事情
public ActionResult Login()
{
  ... stuff ...
  FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
  return RedirectToAction("someaction");
}

public ActionResult SomeAction() 
{
    if (User.IsInRole("ElementryUser"))
    {
        int UserId = objuserrepository.FindBy(i => i.Email == User.Identity.Name).First().Id;
        if (firstIdeaRepository.FindBy(i => i.UserId == UserId).Count() > 0)
        {
          return RedirectToAction("Index", "FirstIdea");
        }
     }
   else
   {
      return RedirectToAction("Index", "Dashboard");
   }
}

这是我之前在自己的应用中看到的问题。你最终会得到一次额外的往返,但这只是在登录时你应该没事。

怀疑您认为有时工作的原因可能是因为您之前的测试已经设置了身份验证Cookie,即您在调用FormsAuthentication.SetAuthCookie之前已经登录。

答案 2 :(得分:0)

无需Thread.Sleep();

您可以关注此文章。您必须使用自定义授权过滤器:

http://www.dotnet-tricks.com/Tutorial/mvc/G54G220114-Custom-Authentication-and-Authorization-in-ASP.NET-MVC.html