3

我有这样的事情:

FormsAuthentication.SetAuthCookie(user, false);
var tmp = Roles.IsUserInRole("administrator");
var _tmp = Roles.IsUserInRole(user, "administrator");

tmp永远是假的,_tmp永远是真的。为什么是tmp假的?

4

3 回答 3

3

由于您在登录操作期间执行此操作,因此可以安全地假设用户尚未登录,因此Useron 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

于 2013-01-29T18:16:58.007 回答
2

var tmp = Roles.IsUserInRole("administrator");正在检查当前登录的用户是否在角色中,同时var _tmp = Roles.IsUserInRole(user, "administrator");正在检查是否user在角色中,他们当时是否已登录。而且由于FormsAuthentication.SetAuthCookie(user, false);在下一个请求之前不会生效,user因此实际上还没有登录。

于 2013-01-29T18:17:02.417 回答
1

SetAuthCookie 只设置cookie。它不会让您登录,也不会加载任何用户信息。

在下一个请求时读取 cookie,然后 ASP.NET 将配置角色和身份作为请求处理管道的一部分。

您可以绕过这一点,但它本质上意味着复制 asp.net 授权代码,全部用于一个请求。重定向用户并重新加载页面可能更容易。

于 2013-01-29T18:42:20.087 回答