关于c#:Context.User在Global.asax.Application_AuthenticateRequest中分配后失去角色

关于c#:Context.User在Global.asax.Application_AuthenticateRequest中分配后失去角色

Context.User losing Roles after being assigned in Global.asax.Application_AuthenticateRequest

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<system.web>
 
    <forms loginUrl="Default.aspx" path="/" protection="All" timeout="360" name="MyAppName" cookieless="UseCookies"  />      
  </authentication>
 
   
  </authorization>
</system.web>

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
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而言,已正确分配了Role。

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

我在做什么错,如何使它正常工作?

更新:我在下面输入了解决方案


这里是问题和解决方案:

在开发的早期,我转到"网站"菜单,然后单击" Asp.net配置"。 这导致将以下行添加到web.config中:

1
2
3
<system.web>
  <roleManager enabled="true" />
</system.web>

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

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


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

以防万一它被否认所覆盖。

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


推荐阅读

    角色扮演是什么意思

    角色扮演是什么意思,,许多用户想知道在网络中的角色扮演的意义是什么,各大论坛今天可以看到类似的问题,用户有作者针对这个问题问,问朋友,本文

    未知软件异常应用程序错误解决方案

    未知软件异常应用程序错误解决方案,,我有很多朋友的电脑未知软件异常应用程序错误的问题,对于异常未知的软件异常中的应用一般提示(0xc00000

    格式化分配单元的大小是什么意思

    格式化分配单元的大小是什么意思,,格式化分配单元的大小是什么意思这是今天的光;问一个百事网小编的问题。对于这个问题,事实上,互联网用户要

    小米手机安装的应用程序包在哪里

    小米手机安装的应用程序包在哪里,,问题: 下载小米手机系统的安装文件在哪里 答案uff1a 下载应用程序包位置:SD卡>下载。 (摘自:小米手册:米

    应用程序对象

    应用程序对象,,应用程序对象是一个应用程序级对象,用于在所有用户之间共享信息,并且在Web应用程序运行期间可以保存数据。 应用的性质: 方法

    电脑怎么分配cpu|电脑怎么分配c盘

    电脑怎么分配cpu|电脑怎么分配c盘,,1. 电脑怎么分配c盘最快最安全的方法是:转移重要数据,之后重分区,重装系统你想不重装系统来调整、合并