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

本文关键字:用户 存储 身份验证 单独 何使用 Global asax | 更新日期: 2023-09-27 18:28:10

我在global.asax 中创建了一个静态变量

public static MemberManager.Member _CurrentUser;

对我来说,问题是它与其他请求共享(如果其他用户在另一个用户的同一时间浏览,他们可能会窃取身份验证)。如何通过不与其他请求共享来修复此代码。为了使其修复I Thing,在请求之前和请求完成之后清除Member。

 this.BeginRequest += ClearMember;
 this.AuthorizeRequest += MvcApplication_AuthorizeRequest;
 this.EndRequest += ClearMember;
  void ClearMember(object sender, EventArgs e)
        {
            _CurrentUser = new MemberManager.Member();
        }

我想在请求完成和开始后将其删除,以使其正常工作。我不确定它是否可行。

有人可以确保它会起作用。我不想在请求之间共享currentUser变量。这个代码能不能让它工作。

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

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

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

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