2014-10-28 95 views
-1

我在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

回答

1

不要爲此使用靜態字段。靜態類字段由在同一個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

1

爲什麼需要存儲身份驗證?

使用表單身份驗證。用戶隨後會在每次請求時發送帶有授權密鑰的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」,但是如果你願意,你可以將緩存存儲在一個文件中,一個單獨的進程或者甚至是一個數據庫中。