Проверка подлинности Windows для пользователей интрасети на уровне приложений (ASP.NET с VB) - PullRequest
1 голос
/ 16 августа 2011

Моя компания использует ActiveDirectory, и, естественно, ИТ-отдел хочет сохранить контроль над ним, а не предоставлять контроль другим пользователям.Я занимаюсь разработкой приложения ASP.NET (только для внутреннего использования) с использованием базы данных SQL Server 2008.

У меня вопрос: как мне BEST использовать пространства имен .NET и SQL Server?управлять доступом к приложению внутри организации на уровне приложения (или, возможно, БД)?Я хотел бы, чтобы пользователь был авторизован на основе его сетевого имени пользователя, предоставленного ActiveDirectory.

Кроме того, я также хотел бы получить доступ к его контактной информации AD.

Из моего понимания яможно использовать класс ActiveDirectoryMembershipProvider или доменные службы в пространстве имен System.DirectoryServices.Есть также LDAP, который, очевидно, является еще одной возможностью.Мне тяжело разобраться во всем этом, и гораздо меньше, который является лучшим вариантом и как его реализовать.Кто-нибудь может дать мне какое-то руководство и, возможно, какой-нибудь простой пример кода?

ОБНОВЛЕНИЕ : Извините, я забыл упомянуть, что я использую VB.NET в качестве источника кода в качестве стандарта компании.

Очень благодарен!;)

Ответы [ 3 ]

1 голос
/ 23 сентября 2011

Как я позже выясню, режим аутентификации Windows прекрасно работает в среде интрасети.Я решил включить этот режим в своей конфигурации IIS при разработке, и чтобы каждая страница автоматически идентифицировала пользователя по его сетевому логину и указывала ему (или разрешала / запрещала доступ к соответствующим страницам).Имейте в виду, что мое решение работает ТОЛЬКО в интрасети / если вы находитесь на контроллере домена.

Вот соответствующий 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

Я надеюсь, что некоторые люди находят это полезным.Я потратил бесчисленные часы на решение, почти идентичное этому.

Приветствия;)

1 голос
/ 16 августа 2011

Вот небольшой фрагмент кода, который положил начало моей бесконечной поездке с Active Directory и ASP.NET.На небольшой тестовой странице я поместил текстовое поле и подключил идентификатор локальной сети, и он возвращает все доступные поля 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Идентификаторы аутентифицированного пользователя Request.ServerVariables("LOGON_USER") и Httpcontext.Current.User.Identity.Name будут вашими друзьями.Помните, что переменная LOGON_USER не заполняется, если вы используете Allow Anonymous Security для доступа к странице ASP.

Я вернусь к некоторым из моих заметок и попытаюсь найти некоторыеиз ресурсов, которые я использовал, которые оказались самыми полезными для меня.Я могу сказать вам, что книга «Руководство разработчика по .NET для программирования служб каталогов» ( Amazon ) использовалась мной ежедневно.

0 голосов
/ 03 февраля 2015

В принятом ответе с использованием «поиск имени пользователя в базе данных и поиск связанной с ним роли / группы» ИМХО не хватает всего смысла.

Решение состоит в том, чтобы установить флажок Аутентификация NTLM в Visual Studio (использование версии 2012 находится в разделе Свойства проекта, Веб, Серверы; другая версия должна быть аналогичной).

...