应用级别内联网用户的 Windows 身份验证(带有 VB 的 ASP.NET)
Posted
技术标签:
【中文标题】应用级别内联网用户的 Windows 身份验证(带有 VB 的 ASP.NET)【英文标题】:Windows Authentication for Intranet Users at the App Level (ASP.NET with VB) 【发布时间】:2011-08-16 17:30:44 【问题描述】:我的公司使用 ActiveDirectory,IT 部门自然希望保持对它的控制,而不是将控制权交给其他用户。我正在使用 SQL Server 2008 数据库开发 ASP.NET 应用程序(仅供内部使用)。
我的问题是,我如何BEST 使用 .NET 命名空间和 SQL Server 在应用程序(或可能是数据库)级别管理对组织内应用程序的访问?我希望用户根据 ActiveDirectory 提供的网络用户名获得授权。
顺便说一句,我还想访问他们的广告联系信息。
据我了解,我可以在 System.DirectoryServices 命名空间中使用 ActiveDirectoryMembershipProvider 类或域服务。还有LDAP,这显然是另一种可能性。我很难理解这一切,更不用说哪个是最佳选择以及如何实现它。谁能给我一些方向,可能还有一些简单的示例代码?
更新:抱歉,我忘了说我使用 VB.NET 作为我的代码源,因为它是公司标准。
非常感谢! ;)
【问题讨论】:
【参考方案1】:这是一个快速的代码 sn-p,它开始了我使用 Active Directory 和 ASP.NET 的永无止境的旅程。它来自一个小测试页面,我放置了一个文本框并插入了 LAN ID,它会返回所有可用的 AD 字段。
Protected Sub btnSearchUserDetails_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSearchUserDetails.Click
Dim Entry1 As New System.DirectoryServices.DirectoryEntry("LDAP://DC=ent,DC=foo,DC=bar,DC=corp", "yourID", "yourPassword")
Dim search As New DirectorySearcher(Entry1)
search.Filter = [String].Format("(SAMAccountName=0)", txtSearchUser.Text)
Dim result As SearchResult = search.FindOne()
Dim user As DirectoryEntry = result.GetDirectoryEntry()
PrintDirectoryEntryProperties(user)
End Sub
Private Sub PrintDirectoryEntryProperties(ByVal entry As System.DirectoryServices.DirectoryEntry)
'loop through all the properties and get the key for each prop
lblPropList.Text = "<table>"
For Each Key As String In entry.Properties.PropertyNames
Dim sPropertyValues As String = [String].Empty
'now loop through all the values in the property;
'can be a multi-value property
For Each Value As Object In entry.Properties(Key)
sPropertyValues += Convert.ToString(Value) + ";<br>"
Next
'cut off the separator at the end of the value list
sPropertyValues = sPropertyValues.Substring(0, sPropertyValues.Length - 5)
'now add the property info to the property list
lblPropList.Text += "<tr><td>" & Key & "</td><td>" & sPropertyValues & "</td></tr>"
Next
lblPropList.Text += "</table>"
End Sub
获取当前认证用户的AD登录IDRequest.ServerVariables("LOGON_USER")
和Httpcontext.Current.User.Identity.Name
将成为你的朋友。请记住the LOGON_USER variable is not populated if you use the Allow Anonymous security to access the ASP page.
我将回顾我的一些笔记,并尝试找到我使用的一些资源,这些资源最终对我最有帮助。在我的脑海中,我可以告诉你,我每天都在使用“.NET 开发人员目录服务编程指南”(Amazon) 一书。
【讨论】:
非常感谢。我很欣赏匿名安全的提醒。这可能会导致我的 SAP 集成出现问题。我想我稍后会回到这个问题上。一旦我有更多信息,我不会忘记回复答案。谢谢芽:) 一年后我才提到这个答案。很有帮助。再次感谢。 :-D【参考方案2】:我后来发现,Windows 身份验证模式可以在 Intranet 环境中完美运行。我决定在开发时在我的 IIS 配置中启用此模式,并让每个页面通过网络登录自动识别用户并指向他们(或允许/禁止访问适当的页面)。请记住,我的解决方案仅适用于 Intranet / 如果您在域控制器上。
这是相关的 Web.config
<system.web>
<authentication mode="Windows" />
<identity impersonate="false" />
</system.web>
我认为最简单的方法是在数据库中查找用户名并找到他们关联的角色/组,然后评估该角色是否应该让他们访问 VB 代码隐藏中的请求页面。以下是获取用户网络用户名的方法:
' While logged into your intranet will return "DOMAIN\username"
Dim username As String = Page.User.Identity.Name
这里有一些示例 VB.NET 代码,可用于(自动)身份验证和允许访问给定页面(不完全是我使用的代码,只是一个示例)。
Dim role As String
Using con As New SqlConnection(ConfigurationManager.ConnectionStrings("conString").ConnectionString)
Dim query As New SqlCommand("select top (1) Role from Users where Username like '" + username + "'", con)
con.Open()
role = query.ExecuteScalar().ToString
End Using
If StrComp(role, "Admin") = 0 Then
welcomeLabel.Text = "Welcome! You may enter"
Else
HttpContext.Current.Server.Transfer("/Kick.aspx")
End If
我希望有些人觉得这很有用。我花了无数个小时来解决几乎与此相同的解决方案。
干杯 ;)
【讨论】:
这是another solution,我使用委托来进行 WITH Impersonation,这是我们的域控制器为我的服务器特别允许的。此解决方案使用impersonate="true"
后面代码中的委托来实现 LDAP 查询。【参考方案3】:
使用“在数据库中查找用户名并找到其关联的角色/组”接受的答案恕我直言,没有重点。
解决方法是在 Visual Studio 中勾选 NTLM Authentication 复选框(使用 2012 版本在项目的 Properties、Web、Servers 下;其他版本应该类似)。
【讨论】:
以上是关于应用级别内联网用户的 Windows 身份验证(带有 VB 的 ASP.NET)的主要内容,如果未能解决你的问题,请参考以下文章
在 asp 中用于 Windows 身份验证的简单自定义角色。网?
如何使用 Windows 身份验证并注册自定义身份验证管理器
ASP.NET Windows 身份验证向应用程序返回错误的用户