简单的问题......
鉴于我有一个ASP.NET站点,它使用[custom] RoleProvider,
有什么方法可以让我以某种方式“刷新”提供者而不强迫用户退出网站并重新登录?
我正在寻找类似于虚构方法的东西
Roles.Refresh()
具体来说,我正在考虑这个问题,如果管理员更改用户的角色,用户会话可能每10分钟刷新一次。
答案 0 :(得分:4)
我认为你的web.config
:
<roleManager enabled="true" defaultProvider="..."
cacheRolesInCookie="true">
角色为cached in a cookie,因此您可以强制它们按deleting the cookie刷新。这种方法对我有用。我添加了cookieName
属性,以便我不依赖于asp.net的默认值。但是,对于您的方案,您可以将cookieTimeout
属性设置为合理的并完成。
当然,此方法不会立即更新角色。删除cookie后,它们将在下一页加载时更新。
答案 1 :(得分:3)
刷新只需要删除cookie:
对于C#:Roles.DeleteCookie();
//作为Roles.Refresh()
答案 2 :(得分: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
答案 3 :(得分:0)
取决于使用的自定义角色提供程序。
只需在每次请求时调用“更新我的角色”功能吗? (糟糕的方式,但至少你肯定会更新它)
答案 4 :(得分:0)
角色缓存在cookie中(当然是加密的)。最简单的解决方案是禁用web.config文件中的缓存。你会失去一些表现。
否则你必须以某种方式重新发送auth cookie。一个主要问题是许多浏览器不会在方法发布的重定向上接受cookie。
另一个对我有用的解决方案:
1)在aspx方法中记录用户并将用户名存储在会话中
//将用户添加到角色审阅者和刷新票证
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)如果用户名存储在会话
中,则在登录页面再次为用户签名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;
}
}