ASP.NET MVCで現在のユーザーを取得する方法


268

フォームモデルでは、次の方法で現在ログインしているユーザーを取得していました。

Page.CurrentUser

ASP.NET MVCのコントローラークラス内で現在のユーザーを取得するにはどうすればよいですか?

回答:


266

コントローラー内からユーザーを取得する必要がある場合は、コントローラーのUserプロパティを使用します。ビューから必要な場合は、具体的に必要なものをに入力しますViewData。または、のプロパティだと思うので、単にUserを呼び出すこともできますViewPage


2
「または、ユーザーがViewPageのプロパティだと思うので、単にUserを呼び出すことができます」-では、ビューにいるときにPage.userを使用するという意味ですか?
mawaldne 2009年

17
はい、「こんにちは、@ User.Identity.Name!」のように使用できます。cshtmlで。
ショーン

198

私はそれがUserうまくいく、つまり、User.Identity.NameまたはUser.IsInRole("Administrator")


19
ちょうどあなたがあなたがのいずれかが必要ですフォームのクラスの外で作業している場合は、これに追加するにはImports System.Web更なるとは、として資格をHttpContext.Current.User.Identity.Name直接、または完全な構文を使用して資格:System.Web.HttpContext.Current.User.Identity.Name
ポール・

Controller内で動作し、ViewModelを使用する場合は、Controllerから継承するか、Paulの提案に従います。
有用なビー

60

お試しくださいHttpContext.Current.User

Public Shared Property Current()As System.Web.HttpContext System.Web.HttpContextの
メンバー

概要:
現在のHTTP要求のSystem.Web.HttpContextオブジェクトを取得または設定します。

戻り値:
現在のHTTPリクエストのSystem.Web.HttpContext


2
どうやらHttpContextには「Current」という名前のプロパティがありません。
Serhat Ozgel、2008年

20
私はあなたたち2人が2つの異なることについて話していると思います。System.Web.HttpContextと静的プロパティ:System.Web.Mvc.Controller.HttpContext(「Current」プロパティがないもの
Jeff Sheldon、

1
それは、MVC以外の環境でも機能しました。ありがとう!:)
Wagner da Silva

38

次のようにASP.NET MVC4でユーザーの名前を取得できます。

System.Web.HttpContext.Current.User.Identity.Name

4
このエラーが発生する場合は、この'System.Web.HttpContextBase' does not contain a definition for 'Current' and no extension method 'Current' accepting a first argument of type 'System.Web.HttpContextBase' could be foundような絶対的な呼び出しを行うことをお勧めしSystem.Web.HttpContext.Current.User.Identity.Nameます。
シンプルなサンドマン

21

これは本当に古いことに気づきましたが、ASP.NET MVCを使い始めたばかりなので、2セントは差し込んでおこうと思いました。

  • Request.IsAuthenticated ユーザーが認証されているかどうかを通知します。
  • Page.User.Identity ログインしているユーザーのIDを提供します。

16

私が使う:

Membership.GetUser().UserName

これがASP.NET MVCで機能するかどうかはわかりませんが、試してみる価値はあります:)


このメンバーシップクラスはどこから来たのですか?IntelliSenseは、デフォルトではそれを認識しません。
Serhat Ozgel、2008年

System.Web.Security名前空間。私はこれがMVCで役立つとは思いませんが、Webフォームのログインコントロールで使用します。
Sean、

1
これは、メンバーシッププロバイダーを使用するASP.NETアプリケーションで役立ちます。
jamiebarrow 2010

2
これは実際にデータベース要求を行います。HttpContext.Current.Userはサポートしていません。
マイクコール


9

フィルター処理の目的で、コントローラーのASP.NET MVC 4に組み込まれた単純な認証を使用して作成されたユーザーIDを参照するには(最初にデータベースとEntity Framework 5を使用してコードファーストバインディングを生成し、テーブルが構造化されている場合に役立ちます) userIDへの外部キーが使用されていること)、使用できます

WebSecurity.CurrentUserId

usingステートメントを追加したら

using System.Web.Security;

4
残念ながら、これはMVC 5ではもう機能していないようです。理由がわからない= /
Jed Grant

2
でのみSystem.Security.Principal.WindowsIdentity.GetCurrent().Name機能しMVC 5ます。しかし、それはユーザー名と共にドメイン名を引き上げます。つまり、domain \ username
shaz

8

次のコードを使用して、ASP.Net MVCで現在ログインしているユーザーを取得できます。

var user= System.Web.HttpContext.Current.User.Identity.GetUserName();

また

var userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name; //will give 'Domain//UserName'

Environment.UserName - Will Display format : 'Username'

7

ユーザー名:

User.Identity.Name

ただし、IDのみを取得する必要がある場合は、以下を使用できます。

using Microsoft.AspNet.Identity;

したがって、ユーザーIDを直接取得できます。

User.Identity.GetUserId();

このメソッドは、System.Guidを
Gilberto B. Terra Jr.

User.Identity.NameはSystem.Security.Principal.IPrincipalのインスタンスであり、idプロパティがありません...このユーザーはUser.Identity.GetUserIdのユーザーオブジェクトとは異なります
Samra


5

使用する System.Security.Principal.WindowsIdentity.GetCurrent().Nameます。

これにより、現在ログインしているWindowsユーザーが取得されます。


1
このコードは質問に答えることがありますが、いくつかのコンテキストを含め、それがどのように機能するかを説明し、それをいつ使用するかを説明する方が良いでしょう。コードのみの回答は、長期的には役に立ちません。
ryanyuyu

System.Security.Principal.WindowsIdentity.GetCurrent()。Nameは、Windowsにログインしている現在のユーザーを返します。OPは、現在Webサイトにログインしているユーザーを要求しています。
GrandMasterFlush 2015

4

価値があるのは、ASP.NET MVC 3では、現在のリクエストのユーザーを返すUserを使用することだけです。


4

ログインページ内にいる場合、たとえばLoginUser_LoggedInイベントでは、Current.User.Identity.Nameは空の値を返すため、yourLoginControlName.UserNameプロパティを使用する必要があります。

MembershipUser u = Membership.GetUser(LoginUser.UserName);



2
var ticket = FormsAuthentication.Decrypt(
                    HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName].Value);

if (ticket.Expired)
{
    throw new InvalidOperationException("Ticket expired.");
}

IPrincipal user =  (System.Security.Principal.IPrincipal) new RolePrincipal(new FormsIdentity(ticket));

2

イントラネット上のActive Directoryで作業している場合、いくつかのヒントを次に示します。

(Windows Server 2012)

Webサーバー上でADと通信するものを実行するには、一連の変更と忍耐が必要です。ローカルIIS / IIS Expressと比較してWebサーバーで実行する場合は、AppPoolのIDで実行されるため、サイトにアクセスした人になりすますように設定する必要があります。

ASP.NET MVCアプリケーションがネットワーク内のWebサーバーで実行されているときに、現在ログインしているユーザーをActive Directoryに取得する方法:

// Find currently logged in user
UserPrincipal adUser = null;
using (HostingEnvironment.Impersonate())
{
    var userContext = System.Web.HttpContext.Current.User.Identity;
    PrincipalContext ctx = new PrincipalContext(ContextType.Domain, ConfigurationManager.AppSettings["AllowedDomain"], null,
                                                ContextOptions.Negotiate | ContextOptions.SecureSocketLayer);
    adUser = UserPrincipal.FindByIdentity(ctx, userContext.Name);
}
//Then work with 'adUser' from here...

AD情報を取得するためのホスティング環境として機能するように、「Active Directoryコンテキスト」に関連するすべての呼び出しを次のようにラップする必要があります。

using (HostingEnvironment.Impersonate()){ ... }

またimpersonate、web.configでtrueに設定しておく必要があります。

<system.web>
    <identity impersonate="true" />

web.configでWindows認証をオンにする必要があります。

<authentication mode="Windows" />

これはActive Directoryユーザーの資格情報を明示的に使用しているため、私はそうは思わない。ユーザーがAD経由で認証されるようにしたいのに、なぜ「フォーム」があるのですか?
Beau D'Amore

私たちの組織では、いくつかの「フィールド」担当者が共有するワークステーションがいくつかある場所があります。そのため、イントラネットWebアプリケーションにログインページを追加する必要があります。
Patee Gutee

回避策として、このアプリの2つのコピーを実行することができます。1つは「フォーム」モードで、独自のIDテーブルを使用するか、1つのアプリで両方を混在させることができますが、より複雑です。簡単にGoogleはこれを明らかにした:stackoverflow.com/questions/2250921/...
ボーD'Amoreの

<identity impersonate = "true" />は、混合すると変更が必要になる場合があります
Beau D'Amore


1

IISマネージャーの[認証]で、以下を無効にします。1)匿名認証2)フォーム認証

次に、以下をコントローラーに追加して、テストとサーバーの展開を処理します。

string sUserName = null;
string url = Request.Url.ToString();

if (url.Contains("localhost"))
  sUserName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
else
  sUserName = User.Identity.Name;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.