2011-12-14 30 views
3

我有一个基于表单的应用程序。该应用程序是使用登录控件生成的标准ASP.Net向导。根的web.config似乎是为了基于表单的身份验证。我确实需要更改<roleManager>元素才能使用type="System.Web.Security.SqlRoleProvider"(而不是Windows令牌),每个How To: Use Role Manager in ASP.NETASP.Net:登录控制,LoginUser_LoggedIn和角色人口

我已经设置了三个角色 - 管理员,工程师,客户。有三个用户 - 管理员(admin),eddie(工程师)和cathy(客户)。我已经使用ASP.Net配置工具验证了用户及其角色。

每个角色在磁盘上都有自己的目录,每个角色都有自己的ASPX文件和“着陆页”集合。每个目录都有一个web.config来限制对相关角色的访问。例如:

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

成功登录后,我勾LoginUser_LoggedIn写目标网址。我遇到的问题是用户的角色没有在登录时填充,所以我没有得到一个好的重定向。在下面的代码中,rolesArray的大小为零。

任何想法?我应该从不同的角度来看待这个吗?

Private Sub LoginUser_LoggedIn(sender As Object, e As System.EventArgs) Handles LoginUser.LoggedIn 

    Try 
     Dim rolesArray() As String 
     rolesArray = Roles.GetRolesForUser() 
     Debug.Assert(rolesArray.Length > 0) 

     If (Roles.IsUserInRole("Administrators") = True) Then 
      LoginUser.DestinationPageUrl = "~/Administrators/Dashboard.aspx" 
     ElseIf (Roles.IsUserInRole("Engineers") = True) Then 
      LoginUser.DestinationPageUrl = "~/Engineers/Workspace.aspx" 
     ElseIf (Roles.IsUserInRole("Customers") = True) Then 
      LoginUser.DestinationPageUrl = "~/Customers/Dashboard.aspx" 
     Else 
      Debug.Assert(False) 
     End If 
    Catch ex As Exception 
     Debug.Print(ex.ToString) 
    End Try 

End Sub 

回答

4

在登录了同样的要求,该cookie是不可用(例如,如果你检查this.User.Identity.IsAuthenticated,则返回false太)。这是因为该cookie是在该请求期间建立的,并且随后的请求将可用。

我建议重定向到一个公共页面,然后再次检查并重新定向,或者使用登录控件的用户标识直接从数据库查询角色。

+0

谢谢Brian。我刚刚发现User.IsAuthenticated对于登录用户来说是False的。奇怪的是,至少可以说。 – jww 2011-12-15 00:50:06