web-dev-qa-db-ja.com

ASP.NETが現在のユーザー名を取得する

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設定を変更して、「匿名ユーザーを有効にする」設定を含めることもできません。仕様は石にキャストされているため、自分の脚(または頭)を切り落とす必要があります。かわった。

現在のログインユーザーの名前を現在の構成で取得する方法が必要だと思います。

何か案は?

ありがとう、

ジェイソン

7
user724198

これが私が(どこかで)見つけて、結局使ったものです。それが他の誰かを助けることができることを願っています!

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
user724198

IISで匿名認証を無効にします。 IISで匿名認証が有効になっている場合、User.Identity.Nameは空になる可能性があります。

Web.configで設定

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

User.Identity.Nameを使用して、ログオンユーザーを取得します。

Environment.UserNameは実行中のスレッドIDです。マークが言ったように偽装を有効にしている場合は、返される結果が異なることがわかります。ただし、これにはASP.NETImpersionationが必要です。 ASP.NETの偽装やスレッドIDの処理が必要ない場合は、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.";
    }

これが 良い例

5
Xorsat

それを機能させる唯一の方法は、IISで「統合Windows認証」を実際にチェックすることだと確信しています。 「匿名アクセスを有効にする」もチェックされている場合は、匿名のみが使用されるため、これをオフにする必要があります...

2
ShaneBlake

ログオンしたユーザー名を取得するさらに別の方法:

Request.ServerVariables["LOGON_USER"]
2
user724198

開発で機能する理由は、VSのテストWebサーバーがIISではなく、現在のユーザーアカウントで実行されているためです。

これをIISで機能させたい場合は、IISを正しく構成できる必要があります。他に方法はありません。

1
blowdart

ドメインとユーザー名がADで_"DOMAIN\username"_のようなものを指定した場合

HttpContext.Current.User.Identity.Name.Split('\\')[0]はドメインを返します

そして

HttpContext.Current.User.Identity.Name.Split('\\')[1]はユーザー名を返します

1
nPcomp

これはあなたが達成しようとしていることのために機能しますか? Environment.GetEnvironmentVariable("USERNAME").ToString();

0
Spacemancraig

上記のすべてを試しましたが、どれも機能しませんでした。また、IISに設定を変更することもできませんでした。これに苦労し、苦労し、苦労しました。また、答えが見つからずに長い間検索しました。1つは、 IISにアクセスできないため、ロックダウンされているため、サーバー設定を変更できませんでした。コードで実行できることを実行する必要がありました。調査したところ、多くの回答が「セットアップIISこのように "。私はそれを次のように扱うことになりました:

Web構成ファイルで、セクション内に次のコード行を追加しました。

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

それから、それは私のローカルでエラーを返しました、それは私が入って修正しなければなりませんでした。自分のマシンの次のパスにあるapplicationhost.configファイルに移動しました(実際のパスは異なる場合があります)。

C:\ users\"your user name"\My Documents\"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
dotnetterdev