gpt4 book ai didi

asp.net - HttpContext.Current.User != HttpContext.User?

转载 作者:行者123 更新时间:2023-12-04 07:39:36 29 4
gpt4 key购买 nike

HttpContext.Current.User 在全局 asax 中与 不同HttpContext.User 在 Action 方法中?我为用户分配了一些角色,但他们似乎迷路了。

下面的代码显示了正在发生的事情。当用户登录时,两个断言都会被命中,首先是全局 asax,然后是 action 方法。然而,它们给出了不同的结果。

首先这个:

protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
// ... omitted some code to check user is authenticated
FormsIdentity identity = (FormsIdentity)HttpContext.Current.User.Identity;

string[] roles = new string[] { "admin", "user" };

HttpContext.Current.User =
new System.Security.Principal.GenericPrincipal(identity, roles);

Assert(HttpContext.User.IsInRole("admin"));
}

然后在我的操作方法中:
public ActionResult Index()
{
bool isAdmin = HttpContext.User.IsInRole("admin");

Assert(isAdmin); // this fails, isAdmin is false

// ...
}

我使用了以下资源

This SO answer

http://csharpdotnetfreak.blogspot.com/2009/02/formsauthentication-ticket-roles-aspnet.html

最佳答案

您的问题标签说“aspnet-mvc(3 和 4)”,那么您是否可以选择使用以下内容来让您的生活更轻松?如果您正在使用 Simple Membership来自 VS2012 中的 MVC 4 Internet 应用程序模板,这将为您开箱即用):

  • WebSecurity.CreateUserAndAccount(name, password) - 创建用户
  • Roles.AddUserToRole (和 AddUserToRoles ) - 将用户添加到角色
  • Roles.IsUserInRole - 测试用户是否处于角色
  • [Authorize(Roles = "admin")] - [Authorize]可以在整个 Controller 或操作上强制执行角色
  • CreateUserAndAccount优点是也很容易为 UserProfile 设置属性,例如:
    WebSecurity.CreateUserAndAccount(newUser.UserName, newUser.Password,
    new { FullName = newUser.FullName, Email = newUser.Email, Timezone = newUser.TZ });
    Roles.AddUserToRoles(newUser.UserName, new[] {"admin", "user"});

    编辑 ,我意识到以上内容并没有回答您关于 .User 的原始问题属性(property)等价。
    HttpContext在 Controller 中是一个属性: Controller.HttpContext . HttpContext global.asax.cs 是静态类,所以这就是你使用 HttpContext.Current 的原因.他们指的是同一件事。

    如果您运行以下代码,您可以看到它们显然是“同一个主体”。所以问题是你分配的角色发生了什么?
    protected void Application_AuthenticateRequest(object sender, EventArgs e) {
    ...
    FormsIdentity identity = (FormsIdentity)HttpContext.Current.User.Identity;
    string[] roles = new string[] { "admin", "user" };
    identity.Label = "test label";
    System.Security.Principal.GenericPrincipal ppl = new System.Security.Principal.GenericPrincipal(identity, roles);
    HttpContext.Current.User = ppl;
    ... }

    public ActionResult Index() {
    bool isAdmin = HttpContext.User.IsInRole("admin");
    bool isAdmin2 = System.Web.HttpContext.Current.User.IsInRole("admin");
    System.Web.Security.FormsIdentity identity = (System.Web.Security.FormsIdentity)HttpContext.User.Identity;

    // The label is carried through from Application_AuthenticateRequest to Index.
    string label = identity.Label;
    }

    问题是,你分配了一个 GenericPrincipal.User .取决于 RoleProvider ,这可以在 RoleManagerModule 期间被覆盖(例如通过 PostAuthenticateRequest )并且(例如)变成了 RolePrincipal .然后这可以推迟到数据库(再次取决于提供者)以获取角色,因此覆盖您的角色。如果您在 Application_OnPostAuthenticateRequest 中完成工作你可能没事。

    关于asp.net - HttpContext.Current.User != HttpContext.User?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16693043/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com