【发布时间】:2009-09-24 19:14:22
【问题描述】:
这是我们当前的设置。我们配置了 Active Directory(域名为 mis1)来处理我们所有的身份验证问题。我们为 impersonation=true 设置了 Web 应用程序,以便我们可以在用户登录时调用数据库查询。对于这个特定的应用程序,IIS 设置为匿名访问,我们可以进行表单身份验证。
为了我们的数据库安全,我们在数据库服务器上设置了本地组,并根据应用程序的需要将用户添加到这些组中。例如,对于同一个 FancyPants 应用程序,我们将有一个“FancyPantsManager”组和一个“FancyPantsUser”组。然后我们设置 SQL Server 2005 登录以映射到服务器上的这些本地组。
我想做的是为用户提供一个登录页面,该页面通过 AD 进行身份验证,然后如果成功,则转到数据库服务器以获取他们的角色(通过调用 xp_logininfo)以存储在用户的会话中。
到目前为止,我通过对 avapi32.dll 文件中的 LogonUser 方法执行 p/Invoke 成功地验证了 Active Directory 的表单身份验证。然后,我获取生成的令牌并生成一个 WindowsIdentity 对象并模拟用户。代码如下所示:
Private Sub loginMain_Authenticate _
(ByVal sender As Object, _
ByVal e As System.Web.UI.WebControls.AuthenticateEventArgs) _
Handles loginMain2.Authenticate
' Assume variables properly declared
IsAuthenticated = LogonUser(UserName, LOGON_DOMAIN, UserPass,
LOGON_TYPE, LOGON_PROVIDER, ResultToken)
If IsAuthenticated
' Setup impersonation for validated user.
WindowsId = New WindowsIdentity(ResultToken)
IdentContext = WindowsId.Impersonate()
' Call stored procedure to retrieve roles using validated user for login.
GetUserRoles(UserName)
End If
End Sub
当我单步调试调试器并输入正确的 ID 和密码时。我通过了身份验证,查看生成的 WindowsIdentity 对象,它指出我的 ID 是“mis1\c07884”,这正是模拟访问 SQL Server 所需要的。但是,当调用 GetRoles 方法时,我收到以下错误消息:
System.Data.SqlClient.SqlException: Could not obtain information
about Windows NT group/user 'c07884', error code 0xffff0002.
在我看来,模拟过程中出现了一些错误。我错过了什么?
【问题讨论】:
标签: asp.net sql-server authentication active-directory