Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用Global.asax存储单独用户的身份验证?_C#_Asp.net_Asp.net Mvc 4 - Fatal编程技术网

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

C# 如何使用Global.asax存储单独用户的身份验证?,c#,asp.net,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc 4,我在global.asax中创建了一个静态变量 public static MemberManager.Member _CurrentUser; 对我来说,问题是它与其他请求共享,如果另一个用户在另一个用户的同一时间浏览,则另一个用户可以窃取身份验证。如何通过不与其他请求共享来修复此代码。要使其修复,我需要在请求之前和请求完成之后清除成员 this.BeginRequest += ClearMember; this.AuthorizeRequest += MvcApplication_Au

我在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变量。此代码是否正常工作。

请勿为此使用静态字段。静态类字段由运行在同一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;
  }
}

为什么需要存储身份验证

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

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

[AllowAnonymous]
public virtual ActionResult Login(string username, string password)
{
   //login logic here
}
在登录操作中检查用户名和密码,如果正确,请执行以下操作:

FormsAuthentication.SetAuthCookie(username, isCookiePersistent);
要注销用户,请调用登录注销操作

FormsAuthentication.SignOut();
注册全局筛选器时,请确保按如下方式注册属性:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{            
    filters.Add(new AuthorizeAttribute());
}
你完了!用户必须登录所有调用,但使用AllowAnonymous属性修饰的调用除外


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

我没有找到会话的命名空间,即使我在thr请求前后开始清除成员,成员是否仍与其他请求共享?我使用从当前请求上下文中获取的会话更新了答案。是的,它仍然是共享的,因为来自不同用户的请求是并行处理的。您想用它实现什么?