我如何使用Global.asax存储单独用户的身份验证?

时间:2014-10-28 12:52:39

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

我在global.asax

中创建了一个静态变量
public static MemberManager.Member _CurrentUser;

我遇到的问题是它与其他请求共享(如果另一个用户在另一个用户的同一时间浏览,则可以窃取身份验证)。如何通过不与其他请求共享来修复此代码。使其修复我想在请求之前和请求完成之后清除成员。

 this.BeginRequest += ClearMember;
 this.AuthorizeRequest += MvcApplication_AuthorizeRequest;
 this.EndRequest += ClearMember;

  void ClearMember(object sender, EventArgs e)
        {
            _CurrentUser = new MemberManager.Member();
        }

在完成请求以及请求的开始之后移除它的东西使它工作。我不确定它会起作用。

有人可以确保它能够正常工作。我不想在请求之间共享currentUser变量。这段代码是否有效。

2 个答案:

答案 0 :(得分:1)

请勿使用静态字段。静态类字段由在同一AppDomain中运行的所有代码(所有线程)共享。将此对象存储在Session:

public static MemberManager.Member _CurrentUser
{
  get
  {
    return (MemberManager.Member)System.Web.HttpContext.Current.Session["__MemberManager_Member"];
  }
  set
  {
    System.Web.HttpContext.Current.Session["__MemberManager_Member"] = value;
  }
}

答案 1 :(得分:1)

为什么需要存储身份验证?

使用表单身份验证。然后,用户将在每次请求时使用auth密钥发送cookie。

在登录操作上添加属性,以便允许匿名调用:

[AllowAnonymous]
public virtual ActionResult Login(string username, string password)
{
   //login logic here
}

在登录操作中检查用户名和密码,如果它们是正确的,请执行以下操作:

FormsAuthentication.SetAuthCookie(username, isCookiePersistent);

要将用户注销,请致电(即退出操作)

FormsAuthentication.SignOut();

注册全局过滤器时,请务必注册“AuthorizeAttribute”,如下所示:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{            
    filters.Add(new AuthorizeAttribute());
}

你完成了!除了使用“AllowAnonymous”属性装饰的用户外,用户必须登录所有呼叫。

编辑:如果要跟踪当前登录的用户,请检查缓存。最基本的是“InMemory”,但如果您愿意,可以将缓存存储在文件,单独的进程中,甚至存储在数据库中。