【发布时间】:2014-02-03 13:55:06
【问题描述】:
我创建了一个简单的角色提供程序。 (所以形成身份验证)。
放置在页面上的标准内置 asp.net 登录控件可以正常工作。
我正在尝试确定角色成员资格的标准“测试”为何会失败。
到目前为止我有这个:
Roles.Provider.IsUserInRole(Membership.GetUser.UserName, "Portal") 返回 true
Roles.IsUserInRole(Membership.GetUser.UserName, "Portal") 返回 false
为什么第二种格式会失败? (注意下面的 IsInRole 代码是由上面的 BOTH 调用的!!)。
User.IsInRole("Portal") 返回 false。
那么,在 3 个示例中,只有一个有效?
有人对为什么 User.IsInRole() 不起作用有任何建议吗?
请注意,User.IsInRole() 出于某种原因不会调用以下例程,但上面的两个代码会。
Public Overrides Function IsUserInRole(username As String, roleName As String) As Boolean
Dim rst As DataTable
Dim strSql As String
MsgBox("Is user in Role test")
strSql = "SELECT Email, RoleName FROM dbo_ContactName " & _
"LEFT JOIN Web_UsersInRoles ON Web_usersInRoles.User_ID = dbo_ContactName.Id " & _
"LEFT JOIN Web_Roles on Web_Roles.ID = Web_UsersInRoles.Role_ID " & _
"WHERE Email = '" & username & "' and RoleName = '" & roleName & "'"
rst = Myrst(strSql)
If rst.Rows.Count > 0 Then
Return True
Else
Return False
End If
End Function
请注意,最令人困惑的是:
Roles.IsUserInRole(Membership.GetUser.UserName, "Portal") 返回 false
我已验证上述内容会导致我的自定义代码运行,但始终返回 false。
事实上,如果我对上面的例程进行硬编码以返回“true”,那么上面的#2 仍然调用我的代码并且仍然返回 false!!!
这么大的问题: 即使对上述例程进行硬编码以始终返回 true,为什么这种格式会失败?
Roles.IsUserInRole(Membership.GetUser.UserName, "Portal")
更糟糕的是,为什么会失败?
User.IsInRole("Portal") 再次总是返回 false。
那么我应该寻找哪些设置才能使 2 和 3 工作?
总结:
1 - Roles.Provider.IsUserInRole(Membership.GetUser.UserName, "Portal") 返回 true
2 - Roles.IsUserInRole(Membership.GetUser.UserName, "Portal") 返回 false
3 - User.IsInRole("Portal") 返回 false
4 - User.Identity.Name 返回正确的登录用户 kallal@msn.com
我还可以从上面的#3 中验证从不调用 IsUserInRole 代码。这包括在清除浏览器缓存之后。
快速 BinGoolge 显示,很多人发现 User.IsInRole() 在采用自定义角色提供程序时停止工作。这里一定有一些“重大”问题在编写导致失败的自定义角色提供程序时被遗漏。
非常感谢有关如何使以上 2 或 3 个选项起作用的链接或建议。
使用 Visual Studio 2013,并使用 vb.net(框架 4.5)创建标准 asp.net 网站
编辑: 作为跟进,我的所有角色功能都有效。
例如: Roles.GetAllRoles() - 这有效(返回所有角色正确)
Roles.GetRolesForUser() - this works, retruns all roles for CURRENT user
Roles.GetUserInRole("Portal") - this works, returns all users in role group "portal"
不工作:
User.IsInRole("Portal") - as noted 1000's of posts on internet have this issue!
Roles.IsUserInRole(Membership.GetUser.UserName, "Portal")
以下是我未包含在原始帖子中的其他子项:
Public Overrides Function GetUsersInRole(roleName As String) As String()
Dim rst As DataTable
Dim i As Integer
Dim a As New List(Of String)
Dim strSql As String
MsgBox("get users in role code")
strSql = "SELECT Email, RoleName FROM dbo_ContactName " & _
"LEFT JOIN Web_UsersInRoles ON Web_usersInRoles.User_ID = dbo_ContactName.Id " & _
"LEFT JOIN Web_Roles on Web_Roles.ID = Web_UsersInRoles.Role_ID " & _
"WHERE RoleName = '" & roleName & "' " & _
"ORDER BY Web_Roles.RoleName"
rst = Myrst(strSql)
For i = 0 To rst.Rows.Count - 1
a.Add(rst.Rows(i).ItemArray(0).ToString)
Next
Return a.ToArray
End Function
Public Overrides Function GetRolesForUser(username As String) As String()
Dim rst As DataTable
Dim i As Integer
Dim a As New List(Of String)
Dim strSql As String
strSql = "SELECT Email, RoleName FROM dbo_ContactName " & _
"LEFT JOIN Web_UsersInRoles ON Web_usersInRoles.User_ID = dbo_ContactName.Id " & _
"LEFT JOIN Web_Roles on Web_Roles.ID = Web_UsersInRoles.Role_ID " & _
"WHERE Email = '" & username & "' " & _
"ORDER BY Web_Roles.RoleName"
rst = Myrst(strSql)
For i = 0 To rst.Rows.Count - 1
a.Add(rst.Rows(i).ItemArray(1).ToString)
Next
Return a.ToArray
End Function
Public Overrides Function GetAllRoles() As String()
Dim rst As DataTable
Dim i As Integer
Dim a As New List(Of String)
rst = Myrst("select RoleName from Web_Roles order by RoleName")
For i = 0 To rst.Rows.Count - 1
a.Add(rst.Rows(i).ItemArray(0).ToString)
Next
Return a.ToArray
End Function
以上所有功能都可以使用。
问题仍然存在:
我们如何连接到启用 User.IsInRole() 的使用。这不起作用。
总之:
Roles.GetRolesForUser - returns "current" roles for user - works fine
Roles.GetUsersInRole("Portal") - works fine
Roles.GetAllRoles() - works fine.
User.IsInRole() - BROKEN!
更多总结:这是一些带有结果输出的代码:
Debug.WriteLine(Roles.Provider.IsUserInRole(Membership.GetUser.UserName, "Portal"))
Debug.WriteLine(Roles.IsUserInRole(Membership.GetUser.UserName, "Portal"))
Debug.WriteLine(User.Identity.Name)
Debug.WriteLine(User.Identity.IsAuthenticated)
Debug.WriteLine(User.IsInRole("Portal"))
输出:
Roles.Provider.IsUserInRole = True
Roles.IsUserInRole = False
User.Identity.Name = kallal@msn.com
User.Identity.IsAuthenticated = True
User.IsInRole("Portal") = False < -- still broken!!!
【问题讨论】:
-
如前所述,我测试了许多在线示例,但都失败了!