web-dev-qa-db-ja.com

ASP.NETアプリケーションにアクセスしている現在のユーザーを取得する方法は?

システムで現在ログインしているユーザーを取得するには、次のコードを使用します。

string opl = System.Security.Principal.WindowsIdentity.GetCurrent().Name.ToString();

この情報が必要なASP.NETアプリケーションで作業しています。そのため、アプリケーションをサーバーに配置して上記のコードを試したところ、文字列oplに「ネットワークサービス」が表示されました。 ASP.NETアプリケーションにアクセスするPCの現在のユーザーを知る必要があります。

25
SamekaTV

メンバーシップを使用している場合は、次のことができます:Membership.GetUser()

コードは、ASP.NETで割り当てられたWindowsアカウントを返しています。

17
Robert

簡単な答えはUser = System.Web.HttpContext.Current.User

Web.configに次の認証要素があることを確認してください。

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

さらに読むレシピ:イントラネットASP.NET Webアプリケーション内でWindows認証を有効にする

51
BenCr

System.Web.HttpContext.Current.User.Identity.Nameを使用すると動作するはずです。以下を実行して、サイトをホストしているサーバーのIISサイト設定を確認してください。

  1. IIS→サイト→あなたのサイト→認証

    IIS Settings

  2. 匿名アクセスが無効になっていることとWindows認証が有効になっていることを確認します。

    Authentication

  3. これで、System.Web.HttpContext.Current.User.Identity.Nameは次のようなものを返すはずです。

    domain\username

21
Santiago Diaz

ベストプラクティスは、Identity.IsAuthenticated最初にプロパティ、次にusr.UserName このような:

string userName = string.Empty;

if (System.Web.HttpContext.Current != null && 
    System.Web.HttpContext.Current.User.Identity.IsAuthenticated)
{
    System.Web.Security.MembershipUser usr = Membership.GetUser();
    if (usr != null)
    {  
        userName = usr.UserName;
    }
}
7
Deepak Kothari

単にページのプロパティを使用できます。そして興味深いのは、コードのどこからでもそのプロパティにアクセスできることです。

これを使って:

HttpContext.Current.User.Identity.Name

見過ぎないでください。

ASP.NET MVCを使用して開発する場合、単純にユーザーを Controllerクラスのプロパティ として設定します。そのため、現在のユーザーを探している一部のモデルで迷子になった場合は、一歩下がってコントローラの関連情報を取得してください。

コントローラーでは、次を使用します。

using Microsoft.AspNet.Identity;

  ...

  var userId = User.Identity.GetUserId();
  ...

userIdを文字列として。

2
peter_the_oak

上記の一般的なコンセンサスの回答には、CORSサポートとの互換性の問題があるようです。 HttpContext.Current.User.Identity.Name属性を使用するには、Windows認証に認証済みユーザー情報を提供させるために匿名認証を無効にする必要があります。残念ながら、CORSシナリオでプリフライトOPTIONSリクエストを処理するには、匿名認証を有効にする必要があります。

これを回避するには、匿名認証を有効のままにして、代わりにHttpContext.Current.Request.LogonUserIdentity属性を使用します。これにより、匿名認証が有効になっている場合でも、認証されたユーザー情報が返されます(イントラネットシナリオを想定しています)。この属性はWindowsUserデータ構造を返し、両方ともSystem.Web名前空間で定義されます

        using System.Web;
        WindowsIdentity user;
        user  = HttpContext.Current.Request.LogonUserIdentity;
1
BruceK

私は同じ問題で走りました。

これは私のために働いたものです:

Setting up Authentication in IIS Panel

Setting up Properties of Windows Authentication in IIS

IIS でWindows認証のプロパティを設定するNTLM has to be the topmost

NTLMは最上位でなければなりません。さらにWeb.configを修正し、すでに存在するか、これらが存在しない場合は追加することを確認します。

<system.web>

  <authentication mode="Windows" />
  <identity impersonate="true"/>

</system.web>

 <!-- you need the following lines of code to bypass errors, concerning type of Application Pool (integrated pipeline or classic) -->

<system.webServer>
   <validation validateIntegratedModeConfiguration="false"/>
</system.webServer>

以下の2つのノードの正当な説明と

<system.web>と<system.webServer>の違い?

そして、もちろん、次の方法でユーザー名を取得します

//I am using the following to get the index of the separator "\\" and remove the Domain name from the string
int indexOfSlashChar = HttpContext.Current.User.Identity.Name.IndexOf("\\"); 

loggedInWindowsUserName = HttpContext.Current.User.Identity.Name.Substring(indexOfSlashChar + 1);
0
George