現在のユーザーを取得する方法、およびMVC5でユーザークラスを使用する方法


159
  • MVC 5で現在ログインしているユーザーのIDを取得するにはどうすればよいですか?StackOverflowの提案を試しましたが、MVC 5用ではないようです。
  • また、ユーザーにコンテンツを割り当てるMVC 5のベストプラクティスは何ですか?(例えばA Userが必要ですItems。万一私が保管し、ユーザーのId中にItem?することができます私は拡張Userを持つクラスをList<Item>ナビゲーションプロパティ?

MVCテンプレートの「個人ユーザーアカウント」を使用しています。

これらを試しました:

'Membership.GetUser()'はnullです。


私が試したもののリファレンスを追加しました。最後のものはMVC4では問題ありませんでしたが、MVC5では問題がありませんでした。また、「ユーザーを使用する」ためのベストプラクティスが必要です:)
Adam Szabo 2013

MVC 5を使用していると言うとき、メンバーシップには何を使用していますか?OWin.Security?
アロン2013

MVCテンプレートの「個人ユーザーアカウント」。
Adam Szabo 2013

3
HttpContext.Current.User.Identity.Name現在ログインしているユーザーの名前です。
Wiktor Zychla 2013

1
Idを取得する方法?Item彼が作成したユーザーに現在のユーザーを割り当てたいのですが、ユーザー名には基づいていません(変更される可能性があります)。「HttpContext.Current 'System.Web.HttpContextBase'に 'Current'の定義が含まれておらず、タイプ 'System.Web.HttpContextBase'の最初の引数を受け入れる拡張メソッド 'Current'が見つからない( usingディレクティブまたはアセンブリ参照がありませんか?) `。あなたのソリューションはMVC 5用のものですか?
Adam Szabo 2013

回答:


313

ASP.NET MVCコントローラーでコーディングする場合は、

using Microsoft.AspNet.Identity;

...

User.Identity.GetUserId();

User.Identity.IsAuthenticatedそれUser.Identity.Nameは言及する価値があり、上記のusingステートメントを追加しなくても機能します。しかし、GetUserId()それなしでは存在しません。

コントローラ以外のクラスにいる場合は、

HttpContext.Current.User.Identity.GetUserId();

MVC 5のデフォルトテンプレートでは、ユーザーIDは文字列として保存されたGUIDです。

まだベストプラクティスはありませんが、ユーザープロファイルの拡張に関する重要な情報が見つかりました:


9
ASP.NET MVC 5のユーザー認証と承認が変更されました。これは、EFまたは他のプロバイダーで使用できるインターフェイスと汎用リポジトリを備えたクレームベースの認証です(EF実装はデフォルトで提供されます)。はのGetUserId下部に保存されている拡張メソッドなのでAss_Start\IdentityConfig.cs、どこで使用する必要がある場合でも、別の名前空間にある場合はusing Microsoft.AspNet.Identity、拡張を表示するようにを設定する必要があります。
Anderson Matos 2013

1
Survey.UserId = Guid.Parse(User.Identity.GetUserId());
NicoJuicy 2013年

使用中の参照を追加した場合、ユーザーに赤の下線が引かれますか これはなぜでしょうか?
Zapnologica 2014年

@Zapnologica:プロジェクトを再構築してみてください。VSIntelliSenseは少し遅いかもしれません。
Adam Szabo 2014年

5
注ユーザーは、コントローラーmsdn.microsoft.com/en-us/library/…でのみ利用できます(@Zapnologicaをコントローラーの外で使用していますか?HttpContext.Current.User.Identity.GetUserId();を試してください)
Adween

28

次のようなものを試してください:

var store = new UserStore<ApplicationUser>(new ApplicationDbContext());
var userManager = new UserManager<ApplicationUser>(store);
ApplicationUser user = userManager.FindByNameAsync(User.Identity.Name).Result;

RTMで動作します。


11
それは不必要なデータベーストリップを課します。
アラッシュ2014

3
@Arash、アプリケーションはどのようにしてデータベースに接続せずにユーザーのオブジェクトを取得するのですか?
fabspro 2014年

2
@アラッシュは気にしない、私はあなたが何を意味するかを理解しています。IDはUser.Identity.GetUserId();で取得できます。データベースのトリップなし。
fabspro 2014年

mvc5(メンバーシップ2)で覚えておいてください。User.Identity.GetUserId()は、テーブル[AspNetUsers]のIDとは異なります。したがって、Jakub ArnoldとRokは正しい方法です
グレイウルフ

私は答えと少し混乱しています。コントローラのコンテキストにUserStoreタイプが存在しないようです。何か案は?
Jhourlad Estrella、

19

1行のコードでApplicationUserオブジェクトが必要な場合(最新のASP.NET Identityがインストールされている場合)、次のことを試してください。

ApplicationUser user = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId());

次のusingステートメントが必要です。

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;

<ApplicationUserManager>のオブジェクトが見つかりません
Fandango68

7

Idを取得するのはかなり簡単で、あなたはそれを解決しました。

2番目の質問は少し複雑です。

したがって、これは現在すべてのプレリリースのものですが、直面している一般的な問題は、新しいプロパティ(または問題の項目コレクション)でユーザーを拡張する場合です。

デフォルトIdentityModelでは、Modelsフォルダーの下に呼び出されるファイルが作成されます(執筆時)。そこにはいくつかのクラスがあります。ApplicationUserApplicationDbContext。コレクションを追加するには、Entity Frameworkで使用している通常のクラスの場合と同じようにItemsApplicationUserクラスを変更します。実際、内部をざっと見てみると、IDに関連するすべてのクラス(User、Roleなど)がPOCOであり、適切なデータアノテーションが付いているため、EF6でうまく機能することがわかります。

次に、AccountControllerコンストラクターにいくつかの変更を加えて、DbContextの使用を認識できるようにする必要があります。

public AccountController()
{
    IdentityManager = new AuthenticationIdentityManager(
    new IdentityStore(new ApplicationDbContext()));
}

現在、ログインしているユーザーのユーザーオブジェクト全体を取得することは、正直なところ少し難解です。

    var userWithItems = (ApplicationUser)await IdentityManager.Store.Users
    .FindAsync(User.Identity.GetUserId(), CancellationToken.None);

その行で仕事が完了し、userWithItems.Items好きなようにアクセスできるようになります。

HTH


プレリリースドキュメントのようなものがあると思いませんか?
Derek Tomes 2013年

@Derek Tomes-私が遭遇したわけではありません。実際のドキュメントについては、11月13日まで待つ必要があると思います。正直に言って素晴らしくはありません。uservoice- aspnet.uservoice.com
forums

わかりましたが、どうすればタイプのインスタンスにアクセスできAccountControllerますか?
ネスト

0

私はあなたの痛みを感じます、私は同じことをやろうとしています。私の場合、ユーザーをクリアしたいだけです。

すべてのコントローラーが継承する基本コントローラークラスを作成しました。その中で私はオーバーライドOnAuthenticationして設定しますfilterContext.HttpContext.User to null

それは私がこれまでに管理した中で最高です...

public abstract class ApplicationController : Controller   
{
    ...
    protected override void OnAuthentication(AuthenticationContext filterContext)
    {
        base.OnAuthentication(filterContext); 

        if ( ... )
        {
            // You may find that modifying the 
            // filterContext.HttpContext.User 
            // here works as desired. 
            // In my case I just set it to null
            filterContext.HttpContext.User = null;
        }
    }
    ...
}

0
        string userName="";
        string userId = "";
        int uid = 0;
        if (HttpContext.Current != null && HttpContext.Current.User != null
                  && HttpContext.Current.User.Identity.Name != null)
        {
            userName = HttpContext.Current.User.Identity.Name;              
        }
        using (DevEntities context = new DevEntities())
        {

              uid = context.Users.Where(x => x.UserName == userName).Select(x=>x.Id).FirstOrDefault();
            return uid;
        }

        return uid;

特にコメントなしではなく、コードを投稿しないでください。あなたがあなたのコードを説明するならば、それはより役に立ちます。
Ali Kanat

0

他の誰かがこの状況にある場合:私はアプリにログインするためのメール検証を作成しているため、ユーザーはまだサインインしていませんが、@ firecapeソリューションのバリエーションであるログインで入力されたメールを確認するために以下を使用しました

 ApplicationUser user = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindByEmail(Email.Text);

以下も必要です。

using Microsoft.AspNet.Identity;

そして

using Microsoft.AspNet.Identity.Owin;


0

これは、AspNetUser IDを取得してホームページに表示する方法です。

HomeController Index()メソッドに次のコードを配置しました

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

ビューページで呼び出すだけ

ViewBag.userId 

プロジェクトを実行すると、ユーザーIDが表示されます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.