2010-01-05 100 views
3

簡單的問題...刷新ASP.NET角色提供

假設我有一個ASP.NET網站,它使用[自定義] RoleProvider,
有什麼辦法中,我能以某種方式「刷新」提供商而不強迫用戶註銷網站並重新登錄?

我在尋找的東西,這將是類似於一個虛構的方法

Roles.Refresh() 

具體來說,我在看這個的,如果管理員更改用戶的角色,用戶會話也許可以刷新自己每隔10分鐘什麼的。

回答

4

我假設你有你的web.config是這樣的:

<roleManager enabled="true" defaultProvider="..." 
      cacheRolesInCookie="true"> 

的角色是cached in a cookie,這樣你就可以迫使他們通過deleting the cookie刷新。這種方法適用於我。我添加了cookieName屬性,以便我不依賴於asp.net的默認值。不過,對於您的場景,您可能只需將cookieTimeout屬性設置爲合理的值並完成此操作即可。

當然,此方法不會立即更新角色。刪除Cookie後,它們將在下一頁加載時更新。

+3

找到了方法,謝謝。這可以通過調用:Roles.DeleteCookie(); – eidylon 2010-03-04 16:49:58

+4

爲了確保沒有人誤解,Roles.DeleteCookie只是從字面上刪除了Cookie,它不能遠程使Cookie無效,因此將其放入您的管理界面(您大多修改其他人的角色,而非您自己的角色)幾乎沒用。 – 2012-10-09 14:12:54

0

取決於使用的自定義角色提供程序。

只需在每個請求中調用「更新我的角色」功能? (壞的方式,但至少你一定要更新)

+0

是的,這就是我想要的(雖然我不會在每個請求上調用它)。 如何在我的自定義RoleProvider中執行此操作? RoleProvider接口中沒有任何東西可以嵌入ASP.NET緩存角色的[how/where]。 – eidylon 2010-01-05 20:06:01

1

如果您不想使用cookie,則可以使用Session對象來緩存角色。 這樣的:

 public override string[] GetRolesForUser(string username) 
    { 
     System.Web.SessionState.HttpSessionState Session = HttpContext.Current.Session; 
     if (Session["roles"] == null) 
       Session["roles"] = MyDataProvider.Security.GetRolesForUser(username); 
     return (string[])Session["roles"]; 
    } 

當你需要更新此用戶的角色,你可以做

Session["roles"] = null 
+1

默認情況下,您不能在GetRolesForUser()方法中使用Session對象。本階段尚未初始化。 雖然不知道是否有解決方法。 – 2010-09-02 14:25:43

0

的角色在cookie中(當然是加密的)緩存。最簡單的解決方案是禁用web.config文件中的緩存。你會失去一些表現。

否則,您必須以某種方式重新發送身份驗證cookie。一個主要的問題是,許多瀏覽器不會使用method post重定向接受cookie。

是爲我工作的另一種解決方案:

1)在一個ASPX methodod註銷用戶和用戶名存儲在會話

//添加用戶到角色審閱,並刷新票

Roles.AddUserToRole(User.Identity.Name, Constants.ROLE_REVISOR); 
FormsAuthentication.SignOut(); 
FormsAuthentication.SetAuthCookie(User.Identity.Name, false); //Might work in some browsers 
Session["REFRESHROLES"] = User.Identity.Name; 
Response.Redirect("someprotectedurl?someid=" + someid); 

2)在loginpage重新登錄用戶是否用戶名被存儲在會話

protected void Page_Load(object sender, EventArgs e) 
{ 
    string returnUrl = Request.QueryString["ReturnUrl"]; 
    if(String.IsNullOrEmpty(returnUrl) == false) 
    { 

     if(Session["REFRESHROLES"] != null) 
     { 
      if(!string.IsNullOrEmpty(Session["REFRESHROLES"].ToString())) 
      { 

       FormsAuthentication.SetAuthCookie(Session["REFRESHROLES"].ToString(), false); 
       Session.Remove("REFRESHROLES"); 
       Response.Redirect(returnUrl); 
       return; 
      } 
     } 
+0

寬鬆,絞索,駝鹿,鵝? – 2011-11-15 13:59:27

+0

對不起 – yonexbat 2011-11-18 12:23:06

3

刷新只需要刪除cookie:

對於C#:Roles.DeleteCookie(); //作爲角色工作。刷新()

相關問題