应用程序级别的Intranet用户Windows身份验证(ASP.NET与VB)

应用程序级别的Intranet用户Windows身份验证(ASP.NET与VB),asp.net,vb.net,active-directory,authorization,Asp.net,Vb.net,Active Directory,Authorization,我的公司使用ActiveDirectory,IT部门自然希望保持对它的控制,而不是将控制权交给其他用户。我正在使用SQL Server 2008数据库开发一个ASP.NET应用程序(仅供内部使用) 我的问题是,我如何才能最好地使用.NET命名空间和SQL Server在应用程序(或可能的DB)级别管理对组织内应用程序的访问?我希望根据ActiveDirectory提供的网络用户名对用户进行授权 顺便说一句,我也想访问他们的广告联系信息 据我所知,我可以在System.DirectoryServi

我的公司使用ActiveDirectory,IT部门自然希望保持对它的控制,而不是将控制权交给其他用户。我正在使用SQL Server 2008数据库开发一个ASP.NET应用程序(仅供内部使用)

我的问题是,我如何才能最好地使用.NET命名空间和SQL Server在应用程序(或可能的DB)级别管理对组织内应用程序的访问?我希望根据ActiveDirectory提供的网络用户名对用户进行授权

顺便说一句,我也想访问他们的广告联系信息

据我所知,我可以在System.DirectoryServices命名空间中使用ActiveDirectoryMembershipProvider类或域服务。还有LDAP,这显然是另一种可能性。我很难理解这一切,更不用说哪一个是最好的选择以及如何实现它了。谁能给我提供一些指导和一些简单的示例代码

更新:对不起,我忘了提到我使用VB.NET作为公司标准的代码源


非常感谢!;)

下面是一段简短的代码片段,它让我开始了使用Active Directory和ASP.NET的永无止境的旅程。它来自一个小测试页面,我放了一个文本框,插入了一个LAN ID,它返回所有可用的广告字段

    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

私有子PrintDirectoryEntryProperties(ByVal条目作为System.DirectoryServices.DirectoryEntry)
'循环遍历所有属性并获取每个道具的关键点
lblPropList.Text=“”
对于entry.Properties.PropertyNames中的每个键作为字符串
Dim sPropertyValues为String=[String]。为空
'现在遍历属性中的所有值;
'可以是多值属性
对于entry.Properties(键)中作为对象的每个值
SPPropertyValues+=Convert.ToString(值)+“;
” 下一个 '切掉值列表末尾的分隔符 SPPropertyValues=SPPropertyValues.Substring(0,SPPropertyValues.Length-5) '现在将属性信息添加到属性列表中 lblPropList.Text+=“”&Key&&sprPropertyValues&& 下一个 lblPropList.Text+=“” 端接头

要获取当前经过身份验证的用户的AD登录ID,
Request.ServerVariables(“LOGON\u user”)
Httpcontext.Current.user.Identity.Name将成为您的朋友。记住


我将回顾我的一些笔记,并试图找到一些对我最有帮助的资源。我可以不假思索地告诉你,我每天都在使用《目录服务编程.NET开发人员指南》()一书。

我后来发现,Windows身份验证模式在intranet环境中非常有效。我决定在开发时在IIS配置中启用此模式,并让每个页面通过其网络登录自动识别用户并指向他们(或允许/不允许访问适当的页面)。请记住,我的解决方案仅适用于intranet/如果您使用的是域控制器

下面是相关的Web.config

<system.web>
    <authentication mode="Windows" />
    <identity impersonate="false" />
</system.web>
下面是一些示例VB.NET代码,可用于验证(自动)并允许访问给定页面(不完全是我使用的代码,只是一个示例)

我希望有些人觉得这很有用。我花了无数个小时来确定一个几乎与此相同的解决方案

干杯;)

使用“在数据库中查找用户名并查找其关联的角色/组”IMHO接受的答案缺少要点


解决方案是选中Visual Studio中的NTLM身份验证复选框(使用版本2012位于项目的属性、Web、服务器下;其他版本应类似)。

非常感谢。我很感激匿名保安的提醒。这可能会导致我的SAP集成出现问题。我想我以后还得再谈这个问题。不过,一旦我有了更多的信息,我不会忘记回复答案。谢谢你,巴德:)一年后我才提到这个答案。非常有用。再次感谢-DHere’s我使用我们的域控制器为我的服务器特别允许的委托进行模拟。此解决方案通过
impersonate=“true”
从代码隐藏中使用委托实现LDAP查询。
<system.web>
    <authentication mode="Windows" />
    <identity impersonate="false" />
</system.web>
' While logged into your intranet will return "DOMAIN\username"
Dim username As String = Page.User.Identity.Name
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