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設定を変更して、「匿名ユーザーを有効にする」設定を含めることもできません。仕様は石にキャストされているため、自分の脚(または頭)を切り落とす必要があります。かわった。
現在のログインユーザーの名前を現在の構成で取得する方法が必要だと思います。
何か案は?
ありがとう、
ジェイソン
これが私が(どこかで)見つけて、結局使ったものです。それが他の誰かを助けることができることを願っています!
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
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.";
}
これが 良い例
それを機能させる唯一の方法は、IISで「統合Windows認証」を実際にチェックすることだと確信しています。 「匿名アクセスを有効にする」もチェックされている場合は、匿名のみが使用されるため、これをオフにする必要があります...
ログオンしたユーザー名を取得するさらに別の方法:
Request.ServerVariables["LOGON_USER"]
開発で機能する理由は、VSのテストWebサーバーがIISではなく、現在のユーザーアカウントで実行されているためです。
これをIISで機能させたい場合は、IISを正しく構成できる必要があります。他に方法はありません。
ドメインとユーザー名がADで_"DOMAIN\username"
_のようなものを指定した場合
HttpContext.Current.User.Identity.Name.Split('\\')[0]
はドメインを返します
そして
HttpContext.Current.User.Identity.Name.Split('\\')[1]
はユーザー名を返します
これはあなたが達成しようとしていることのために機能しますか? Environment.GetEnvironmentVariable("USERNAME").ToString();
上記のすべてを試しましたが、どれも機能しませんでした。また、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);
乾杯!