私のプロジェクトにはApplicationUser
というAuthor
プロパティを持つArticleエンティティがあります。現在記録されているApplicationUser
の完全なオブジェクトを取得するにはどうすればいいですか?新しい記事を作成している間、Author
のArticle
プロパティを現在のApplicationUser
に設定する必要があります。
古いメンバーシップメカニズムではそれは簡単でしたが、新しいアイデンティティアプローチではこれを行う方法がわかりません。
私はこのようにしてみました:
using Microsoft.AspNet.Identity;
ApplicationUser currentUser = db.Users.FirstOrDefault(x => x.Id == User.Identity.GetUserId());
しかし、私は次の例外が出ます:
LINQ to Entitiesはメソッド 'System.String GetUserId(System.Security.Principal.IIdentity)'メソッドを認識しないため、このメソッドをストア式に変換することはできません。ソース= EntityFramework
これは、初心者向けに追加のコンテキストを持つという新たな依存関係をもたらしますが、今後はユーザーデータベーステーブルが変更されます(過去2年間で3回)が、APIは一貫しています。たとえば、Identity Frameworkではusers
テーブルは現在AspNetUsers
と呼ばれており、いくつかの主キーフィールドの名前は変更され続けているため、いくつかの回答のコードは現状のままで動作しなくなります。
別の問題は、データベースへの基礎となるOWINアクセスが別のコンテキストを使用するため、別のSQLアクセスからの変更が無効な結果を生み出す可能性があることです(たとえば、データベースに加えられた変更が表示されない)。やはり解決策は提供されたAPIをで処理することであり、回避策それを試みることではありません。
ASP.Net IDで現在のユーザーオブジェクトにアクセスする正しい方法は(この日現在)です。
var user = UserManager.FindById(User.Identity.GetUserId());
または、非同期のアクションがある場合は、次のようになります。
var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
FindById
では、非同期でないUserManager
メソッドを使用できるように、次のusingステートメントが必要です(UserManagerではextension methodsです。これを含めない場合は、FindByIdAsync
のみが表示されます)。
using Microsoft.AspNet.Identity;
あなたがまったくコントローラーにいない場合(例えばIOC injectionを使用している場合)、ユーザーIDは以下から完全に取得されます。
System.Web.HttpContext.Current.User.Identity.GetUserId();
あなたが標準のアカウントコントローラにいない場合、あなたはあなたのコントローラに(例として)以下を追加する必要があるでしょう:
/// <summary>
/// Application DB context
/// </summary>
protected ApplicationDbContext ApplicationDbContext { get; set; }
/// <summary>
/// User manager - attached to application DB context
/// </summary>
protected UserManager<ApplicationUser> UserManager { get; set; }
this.ApplicationDbContext = new ApplicationDbContext();
this.UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(this.ApplicationDbContext));
2015年3月更新
注意:Identityフレームワークの最新の更新により、認証に使用される基本クラスの1つが変更されました。これで、現在のHttpContentのOwin Contextからアクセスできます。
ApplicationUser user = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId());
AzureでEFおよびIdentity Frameworkを使用している場合、リモートデータベース接続(Azureデータベースに対するローカルホストテストなど)を使用すると、「エラー:19 - 物理接続が使用できません」という恐ろしいエラーがランダムに発生します。再試行を追加することができない(または不足している.Include(x->someTable)
のように見える)Identity Frameworkの内部に原因が埋まっているので、プロジェクトにカスタムのSqlAzureExecutionStrategy
を実装する必要があります。
私の間違い、私はLINQクエリの中でメソッドを使うべきではありませんでした。
正しいコード:
string currentUserId = User.Identity.GetUserId();
ApplicationUser currentUser = db.Users.FirstOrDefault(x => x.Id == currentUserId);
それは答えのコメントにありますが、誰も実際の解決策としてこれを投稿していません。
一番上にusingステートメントを追加するだけです。
using Microsoft.AspNet.Identity;
Ellbarのコードは機能します!あなただけを使用して追加する必要があります。
1 - using Microsoft.AspNet.Identity;
そして... Ellbarのコード:
2 - string currentUserId = User.Identity.GetUserId(); ApplicationUser currentUser = db.Users.FirstOrDefault(x => x.Id == currentUserId);
このコード(currentUser
内)を使えば、接続ユーザーの一般データを扱うことになります。追加のデータが必要な場合は... このリンクを参照 /
ASP.NET Identity 3.0.0以降、これはにリファクタリングされました。
//returns the userid claim value if present, otherwise returns null
User.GetUserId();
ApplicationDbContext context = new ApplicationDbContext();
var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context));
ApplicationUser currentUser = UserManager.FindById(User.Identity.GetUserId());
string ID = currentUser.Id;
string Email = currentUser.Email;
string Username = currentUser.UserName;
今のところasp.mvcプロジェクトテンプレートは、このようにユーザーマネージャを取得するアカウントコントローラを作成します。
HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>()
以下は私のために働きます:
ApplicationUser user = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(User.Identity.GetUserId());
MVC 5の場合は、WebApplicationテンプレートスキャフォールドのManageControllerのEnableTwoFactorAuthenticationメソッド内を見てください。
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> EnableTwoFactorAuthentication()
{
await UserManager.SetTwoFactorEnabledAsync(User.Identity.GetUserId(), true);
var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
if (user != null)
{
await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
}
return RedirectToAction("Index", "Manage");
}
答えは、Microsoft自身が示唆しているとおりです。
var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
ApplicationUserクラスで定義したすべての追加プロパティがあります。
誰かがweb forms
のIdentity
ユーザーと協力している場合、私はそうすることによってそれをうまく動かしました:
var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();
var user = manager.FindById(User.Identity.GetUserId());
コードをフォローすることでアプリケーションユーザを取得することに成功しました
var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));
var user = manager.FindById(User.Identity.GetUserId());
ApplicationUser EmpUser = user;