簡單的問題...刷新ASP.NET角色提供
假設我有一個ASP.NET網站,它使用[自定義] RoleProvider,
有什麼辦法中,我能以某種方式「刷新」提供商而不強迫用戶註銷網站並重新登錄?
我在尋找的東西,這將是類似於一個虛構的方法
Roles.Refresh()
具體來說,我在看這個的,如果管理員更改用戶的角色,用戶會話也許可以刷新自己每隔10分鐘什麼的。
簡單的問題...刷新ASP.NET角色提供
假設我有一個ASP.NET網站,它使用[自定義] RoleProvider,
有什麼辦法中,我能以某種方式「刷新」提供商而不強迫用戶註銷網站並重新登錄?
我在尋找的東西,這將是類似於一個虛構的方法
Roles.Refresh()
具體來說,我在看這個的,如果管理員更改用戶的角色,用戶會話也許可以刷新自己每隔10分鐘什麼的。
我假設你有你的web.config
是這樣的:
<roleManager enabled="true" defaultProvider="..."
cacheRolesInCookie="true">
的角色是cached in a cookie,這樣你就可以迫使他們通過deleting the cookie刷新。這種方法適用於我。我添加了cookieName
屬性,以便我不依賴於asp.net的默認值。不過,對於您的場景,您可能只需將cookieTimeout
屬性設置爲合理的值並完成此操作即可。
當然,此方法不會立即更新角色。刪除Cookie後,它們將在下一頁加載時更新。
取決於使用的自定義角色提供程序。
只需在每個請求中調用「更新我的角色」功能? (壞的方式,但至少你一定要更新)
是的,這就是我想要的(雖然我不會在每個請求上調用它)。 如何在我的自定義RoleProvider中執行此操作? RoleProvider接口中沒有任何東西可以嵌入ASP.NET緩存角色的[how/where]。 – eidylon 2010-01-05 20:06:01
如果您不想使用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
默認情況下,您不能在GetRolesForUser()方法中使用Session對象。本階段尚未初始化。 雖然不知道是否有解決方法。 – 2010-09-02 14:25:43
的角色在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;
}
}
寬鬆,絞索,駝鹿,鵝? – 2011-11-15 13:59:27
對不起 – yonexbat 2011-11-18 12:23:06
刷新只需要刪除cookie:
對於C#:Roles.DeleteCookie();
//作爲角色工作。刷新()
找到了方法,謝謝。這可以通過調用:Roles.DeleteCookie(); – eidylon 2010-03-04 16:49:58
爲了確保沒有人誤解,Roles.DeleteCookie只是從字面上刪除了Cookie,它不能遠程使Cookie無效,因此將其放入您的管理界面(您大多修改其他人的角色,而非您自己的角色)幾乎沒用。 – 2012-10-09 14:12:54