web-dev-qa-db-ja.com

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

  • 現在ログインしているユーザーのIDをMVC 5に取得するにはどうすればよいですか。私はStackOverflowの提案を試してみましたが、MVC 5用ではないようです。
  • また、MVC 5がユーザーにコンテンツを割り当てるためのベストプラクティスは何ですか? (例えばUserItemsを持つべきです。ユーザーのIdItemに格納するべきですか?UserクラスをList<Item>ナビゲーションプロパティで拡張できますか?

私はMVCテンプレートの "Individual User Accounts"を使っています。

これらを試してみました:

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

152
Adam Szabo

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

using Microsoft.AspNet.Identity;

...

User.Identity.GetUserId();

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

もしあなたがController以外のクラスにいるのなら、

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

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

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

300
Adam Szabo

次のようにしてください。

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

RTMと連携します。

28
Rok Bermež

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

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;
18
firecape

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

2つ目の質問はもう少し複雑です。

ですので、これは現在すべてのプレリリースのものですが、あなたが直面している共通の問題はあなたが新しいプロパティ(またはあなたが問題になっているItemsコレクション)でユーザを拡張するところです。

箱から出してすぐに(執筆時点で)Modelsフォルダーの下にIdentityModelと呼ばれるファイルがあります。そこにはいくつかのクラスがあります。 ApplicationUserApplicationDbContextItemsのコレクションを追加するには、これがEntity Frameworkで使用していた通常のクラスであるのと同じように、ApplicationUserクラスを変更します。実際、内部を簡単に見てみると、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

7
Stimul8d
        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;
0
Hari Lakkakula

他の誰かがこのような状況を持っている場合:私は私のユーザーがまだサインインしていないように私のアプリにログインするためのEメール検証を作成しています。

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

次のものも必要になります。

using Microsoft.AspNet.Identity;

そして

using Microsoft.AspNet.Identity.Owin;
0
Duan Walker

.Net MVC5コア2.2では、HttpContext.User.Identity.Nameを使用します。それは私のために働いた。

0
Bhupinder Yadav

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

私は全てのコントローラが継承する基本コントローラクラスを作成しました。その中で私は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
Derek Tomes