ASP.NET Получение текущего имени пользователя - PullRequest
7 голосов
/ 07 июля 2011

Я пытаюсь создать приложение во внутренней сети нашей компании, используя ASP.NET и VB.NET.

Ни одна из этих функций ничего не возвращает после публикации моего приложения в IIS. Они отлично работают при разработке (то есть: нажимая F5, я получаю свое обычное сетевое имя пользователя), но после публикации они возвращают '' (пустую строку).

HttpContext.Current.User.Identity.Name
Page.User.Identity.Name

Я ищу что-нибудь, что угодно, что позволит получить текущее имя пользователя. Обратите внимание, что я НЕ МОГУ изменить эти настройки в моем файле web.config из-за других функциональных требований.

    <authentication mode="Windows"/>

    <roleManager enabled="true" cacheRolesInCookie="true" defaultProvider="AspNetWindowsTokenRoleProvider" cookieName=".ASPXROLES" cookiePath="/" cookieTimeout="480" cookieRequireSSL="false" cookieSlidingExpiration="true" createPersistentCookie="false" cookieProtection="All" />

Я также не могу изменить какие-либо настройки IIS, чтобы включить параметр «Включить анонимного пользователя». Спецификации отлиты из камня, и мне пришлось бы отрубить собственную ногу (или голову), чтобы изменить их.

Я думаю, что должен быть способ получить имя текущего зарегистрированного пользователя в моей текущей конфигурации.

Есть идеи?

Спасибо

Jason

Ответы [ 8 ]

5 голосов
/ 08 июля 2011

Отключить анонимную аутентификацию в IIS.User.Identity.Name может быть пустым, если в IIS включена анонимная аутентификация.

Установить в web.config

<configuration>
  <system.web>
    <authentication mode="Windows" />
         <authorization>
             <deny users="?"/>
          </authorization> 
    </system.web> 
</configuration>

Используйте User.Identity.Name для входа в систему.

Environment.UserName - идентификатор работающего потока.Если вы включили Олицетворение, как сказал Марк, вы можете узнать, что возвращаемый результат будет другим.Однако для этого требуется ASP.NET Impersionation.Если вам не требуется олицетворение ASP.NET и работа с идентификатором потока, вы можете игнорировать Environment.UserName, если и просто использовать User.Identity.Name.

Также проверить перед выполнением какого-либо действия.

 if (User.Identity.IsAuthenticated)
    {
        Page.Title = "Home page for " + User.Identity.Name;
    }
    else
    {
        Page.Title = "Home page for guest user.";
    }

Вот хороший пример

2 голосов
/ 08 июля 2011

И еще один способ получить имя вошедшего в систему пользователя:

Request.ServerVariables["LOGON_USER"]
2 голосов
/ 08 июля 2011

Вот что я нашел (где-то) и в итоге использовал.Надеюсь, что это может помочь кому-то еще!

Public Shared Function Check_If_Member_Of_AD_Group(ByVal username As String, _
ByVal grouptoCheck As String, _
ByVal domain As String, _
ByVal ADlogin As String, _
ByVal ADpassword As String) _
As Boolean

    Dim myDE As DirectoryEntry
    Dim EntryString As String
    Dim NumberOfGroups As Integer
    Dim tempString As String


    'Checks to see if the specified user is a member of the specified group
    Try

        'Setup the LDAP basic entry string.
        EntryString = "LDAP://" & domain


        'Make the group to check all lowercase (for matching)
        grouptoCheck = grouptoCheck.ToLower()


        'Use the correct overloaded function of DirectoryEntry
        If (ADlogin <> "" AndAlso ADpassword <> "") Then
            myDE = New DirectoryEntry(EntryString, ADlogin, ADpassword)
        Else
            myDE = New DirectoryEntry(EntryString)
        End If


        'Filter the directory searcher and get the group names
        Dim myDirectorySearcher As New DirectorySearcher(myDE)
        myDirectorySearcher.Filter = "sAMAccountName=" & username
        myDirectorySearcher.PropertiesToLoad.Add("MemberOf")
        Dim myresult As SearchResult = myDirectorySearcher.FindOne()


        'Get the number of groups, so they can be itereated
        NumberOfGroups = myresult.Properties("memberOf").Count() - 1


        While (NumberOfGroups >= 0)
            'Extract the group name from the result set of the index
            tempString = myresult.Properties("MemberOf").Item(NumberOfGroups)
            tempString = tempString.Substring(0, tempString.IndexOf(",", 0))
            tempString = tempString.Replace("CN=", "")
            tempString = tempString.ToLower()
            tempString = tempString.Trim()

            If (grouptoCheck = tempString) Then         'We got a winner
                Return True
            End If
            NumberOfGroups = NumberOfGroups - 1
        End While

        Return False                                    'User is not in the specified group



    Catch ex As Exception

        Check_If_Member_Of_AD_Group = False             'If all else fails, don't authenticate

    End Try


End Function
2 голосов
/ 07 июля 2011

Я почти уверен, что единственный способ заставить его работать - это проверить «встроенную проверку подлинности Windows» в IIS.Если также установлен флажок «включить анонимный доступ», он будет использовать только анонимный доступ, поэтому вам следует отключить его ...

1 голос
/ 28 декабря 2017

Если для домена и имени пользователя указано что-то вроде "DOMAIN\username" в AD

HttpContext.Current.User.Identity.Name.Split('\\')[0] возвращает домен

и

HttpContext.Current.User.Identity.Name.Split('\\')[1] возвращает имя пользователя

1 голос
/ 07 июля 2011

Причина, по которой он работает в разработке, заключается в том, что тестовый веб-сервер VS не является IIS и работает под вашей текущей учетной записью пользователя.

Если вы хотите, чтобы это работало в IIS, вам необходимо правильно настроить IIS - другого способа сделать не существует.

0 голосов
/ 07 августа 2017

Я попробовал все вышеперечисленное, и ни один из них не сработал. Я также не мог войти в свой IIS, чтобы изменить настройки. Я боролся и боролся и боролся с этим. Я тоже долго искал, не найдя ответа. Одна из вещей заключается в том, что у меня нет доступа к IIS, который заблокирован, поэтому я не мог изменить какие-либо настройки сервера. Я должен был пойти с тем, что я был способен делать в коде. Когда я исследовал это, во многих ответах говорилось: «Настройте IIS как этот». , хорошо, когда у вас есть доступ к IIS, но я не ... мне пришлось работать с тем, что я мог делать в коде. Итак, я закончил так:

В моем файле веб-конфигурации я добавил следующие строки кода в раздел:

<system.webServer>
 <security>
  <authentication>
   <anonymousAuthentication enabled="false" />
   <windowsAuthentication enabled="true" />
  </authentication>
</security>
</system.webServer>

Затем он вернул ошибку на моем локальном компьютере, которую я должен был исправить и исправить. Я пошел в файл applicationhost.config, расположенный по следующему пути на моем компьютере (ваш может отличаться):

C: \ users \ "ваше имя пользователя" \ Мои документы \ "yourIISInstallation" \ config \ applicationhost.config

и я изменил следующие настройки на «разрешить», которые были установлены на «запретить»:

<section name="anonymousAuthentication" overrideModeDefault="Deny" />

изменено на

<section name="anonymousAuthentication" overrideModeDefault="Allow" />

и

<section name="windowsAuthentication" overrideModeDefault="Deny" />

изменено на:

<section name="windowsAuthentication" overrideModeDefault="Allow" />

в

<sectionGroup name="authentication">

раздел. Прежде чем я нашел это исправление, я вырывал свои волосы по этому. Я надеюсь, что это помогает кому-то. Как только я вставил приведенный выше код в файл webconfig, он работал в интрасети, он просто возвращал ошибки в моем локальном файле, но как только я добавил вышеупомянутое в свой локальный файл applicationhost.config, он начал работать на моем локальном также. Затем я вызвал следующую переменную, чтобы вернуть имя вошедшего в систему пользователя в Windows:

HttpContext.Current.User.Identity.Name.ToString().Substring((HttpContext.Current.User.Identity.Name.ToString().IndexOf("\\")) + 1);

Ура!

0 голосов
/ 07 июля 2011

Будет ли это работать для того, что вы пытаетесь достичь? Environment.GetEnvironmentVariable("USERNAME").ToString();

...