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

问题描述:

我在global.asax中如何使用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(); 
     } 

我的东西,使其工作由刚的请求,并请求begining完成后,将其删除。我不确定它会起作用。

有人可以确定它会工作。我不想在请求之间共享我的currentUser变量。这段代码是否能够工作?

+0

你想用这个做什么? – avidenic 2014-10-28 13:29:09

不要为此使用静态字段。静态类字段由在同一个AppDomain中运行的所有代码(所有线程)共享。将此对象存储在会话中:

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; 
    } 
} 
+0

我没有找到Session的命名空间,即使我开始在thr请求之前和之后清除成员,成员仍与其他请求共享? – Adrian 2014-10-28 13:26:50

+0

我用当前请求上下文中的'Session'更新了答案。是的,它仍然是共享的,因为来自不同用户的请求是并行处理的。 – Igor 2014-10-28 13:31:52

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

使用表单身份验证。用户随后会在每次请求时发送带有授权密钥的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”,但是如果你愿意,你可以将缓存存储在一个文件中,一个单独的进程或者甚至是一个数据库中。