我有这样的事情:
FormsAuthentication.SetAuthCookie(user, false);
var tmp = Roles.IsUserInRole("administrator");
var _tmp = Roles.IsUserInRole(user, "administrator");
tmp
永远是假的,_tmp
永远是真的。为什么是tmp
假的?
我有这样的事情:
FormsAuthentication.SetAuthCookie(user, false);
var tmp = Roles.IsUserInRole("administrator");
var _tmp = Roles.IsUserInRole(user, "administrator");
tmp
永远是假的,_tmp
永远是真的。为什么是tmp
假的?
由于您在登录操作期间执行此操作,因此可以安全地假设用户尚未登录,因此User
on HttpContext
(可从您的控制器通过this.User
或 just访问User
)设置为未经身份验证的主体。Roles
将使用 currentUser.Identity.Name
来获取用户名和检索角色,因此在这种情况下,您需要使用第二个重载。
如果出于某种原因需要使用第一个重载,则必须更新用户:
User = new GenericPrincipal(new GenericIdentity(user, "forms"), new string[0]);
通常,FormsAuth 模块会User
在用户登录后下次访问页面时进行适当的更新,方法是读取 auth ticket cookie,解密它,并使用在票证中找到的名称创建一个新GenericPrincipal
的 a 。FormsIdentity
var tmp = Roles.IsUserInRole("administrator");
正在检查当前登录的用户是否在角色中,同时var _tmp = Roles.IsUserInRole(user, "administrator");
正在检查是否user
在角色中,他们当时是否已登录。而且由于FormsAuthentication.SetAuthCookie(user, false);
在下一个请求之前不会生效,user
因此实际上还没有登录。
SetAuthCookie 只设置cookie。它不会让您登录,也不会加载任何用户信息。
在下一个请求时读取 cookie,然后 ASP.NET 将配置角色和身份作为请求处理管道的一部分。
您可以绕过这一点,但它本质上意味着复制 asp.net 授权代码,全部用于一个请求。重定向用户并重新加载页面可能更容易。