【问题标题】:Context.User losing Roles after being assigned in Global.asax.Application_AuthenticateRequestContext.User 在 Global.asax.Application_AuthenticateRequest 中分配后失去角色
【发布时间】:2010-09-08 13:09:50
【问题描述】:

我在我的 asp.net (3.5) 应用程序中使用表单身份验证。我还使用角色来定义哪些用户可以访问应用程序的哪些子目录。因此,我的 web.config 文件的相关部分如下所示:

<system.web>
  <authentication mode="Forms">
    <forms loginUrl="Default.aspx" path="/" protection="All" timeout="360" name="MyAppName" cookieless="UseCookies"  />      
  </authentication>
  <authorization >
    <allow users="*"/>
  </authorization>
</system.web>

<location path="Admin">
  <system.web>
    <authorization>
      <allow roles="Admin"/>
      <deny users="*"/>
    </authorization>
  </system.web>
</location>

根据我所阅读的内容,这应该确保唯一能够访问 Admin 目录的用户将是已经过身份验证并分配了 Admin 角色的用户。

用户身份验证、保存身份验证票证和其他相关问题都可以正常工作。如果我从 web.config 文件中删除标签,一切正常。当我尝试强制只有具有 Admin 角色的用户才能访问 Admin 目录时,问题就出现了。

基于此MS KB article 以及提供相同信息的其他网页,我已将以下代码添加到我的 Global.asax 文件中:

protected void Application_AuthenticateRequest(Object sender, EventArgs e) {
    if (HttpContext.Current.User != null) {
        if (Request.IsAuthenticated == true) {    
            // Debug#1            
            FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(Context.Request.Cookies[FormsAuthentication.FormsCookieName].Value);
            // In this case, ticket.UserData = "Admin"                
            string[] roles = new string[1] { ticket.UserData }; 
            FormsIdentity id = new FormsIdentity(ticket);
            Context.User = new System.Security.Principal.GenericPrincipal(id, roles);
            // Debug#2
        }
    }
}

但是,当我尝试登录时,我无法访问 Admin 文件夹(被重定向到登录页面)。

尝试调试问题,如果我单步执行请求,如果我在上面标记为 Debug#1 的行处执行 Context.User.IsInRole("Admin"),它会返回 false。如果我在 Debug#2 行执行相同的语句,它等于 true。所以至少就 Global.asax 而言,角色被正确分配了。

在 Global.asax 之后,执行会直接跳转到登录页面(因为缺少角色会导致 admin 文件夹中的页面加载被拒绝)。但是,当我在登录的 Page_Load 的第一行执行相同的语句时,它返回 false。因此,在 Global.asax 中的 Application_AuthenticateRequest 和受限目录中 WebForm 的初始加载之后的某个地方,角色信息正在丢失,导致身份验证失败(注意:在 Page_Load 中,正确的身份验证票证仍然分配给 Context.User.Id - 只有角色正在丢失)。

我做错了什么,我怎样才能让它正常工作?


更新:我输入了solution below

【问题讨论】:

标签: c# .net asp.net forms-authentication roles


【解决方案1】:

这是问题和解决方案

在开发的早期,我进入网站菜单并单击 Asp.net 配置。这导致以下行被添加到 web.config:

<system.web>
  <roleManager enabled="true" />
</system.web>

从那时起,该应用程序假定我是通过 Asp.net 站点管理器而不是通过 FormsAuthentication 角色来执行角色的。因此,尽管实际的身份验证和角色逻辑设置正确,但仍会反复失败。

从 web.config 中删除此行后,一切正常。

【讨论】:

    【解决方案2】:

    这只是一个随机的镜头,但是您是否因为管理员的授权顺序而被阻止?也许您应该尝试切换您的全部拒绝和您的全部管理员。

    以防它被拒绝覆盖。

    (我在这里有代码示例,但没有显示出来。

    【讨论】:

    • @JordanH - 从我在许多网站 (codeproject.com/KB/web-security/…) 上读到的内容,拒绝用户必须在允许角色之后。如果拒绝先出现,那么永远不会允许工作。现在的方式应该允许某些角色,然后拒绝任何不符合先前定义的角色的人。(我也尝试了您的建议,但没有奏效)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 2014-05-11
    • 2012-06-29
    • 1970-01-01
    • 2019-02-08
    相关资源
    最近更新 更多