User
はItems
を持つべきです。ユーザーのId
をItem
に格納するべきですか?User
クラスをList<Item>
ナビゲーションプロパティで拡張できますか?私はMVCテンプレートの "Individual User Accounts"を使っています。
これらを試してみました:
'Membership.GetUser()'はnullです。
ASP.NET MVCコントローラでコーディングしている場合は、
using Microsoft.AspNet.Identity;
...
User.Identity.GetUserId();
User.Identity.IsAuthenticated
とUser.Identity.Name
は、上記のusing
ステートメントを追加しなくても機能することを言及する価値があります。しかしGetUserId()
はそれなしでは存在しません。
もしあなたがController以外のクラスにいるのなら、
HttpContext.Current.User.Identity.GetUserId();
MVC 5のデフォルトテンプレートでは、ユーザーIDは文字列として格納されたGUIDです。
まだベストプラクティスはありませんが、ユーザープロファイルの拡張に関する有益な情報がいくつか見つかりました。
Identity
の概要: http://blogs.msdn.com/b/webdev/archive/2013/06/27/introducing-asp-net-identity-membership-system-for-asp -net-applications.aspx次のようにしてください。
var store = new UserStore<ApplicationUser>(new ApplicationDbContext());
var userManager = new UserManager<ApplicationUser>(store);
ApplicationUser user = userManager.FindByNameAsync(User.Identity.Name).Result;
RTMと連携します。
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;
IDを取得するのはかなり簡単で、それを解決しました。
2つ目の質問はもう少し複雑です。
ですので、これは現在すべてのプレリリースのものですが、あなたが直面している共通の問題はあなたが新しいプロパティ(またはあなたが問題になっているItemsコレクション)でユーザを拡張するところです。
箱から出してすぐに(執筆時点で)Modelsフォルダーの下にIdentityModel
と呼ばれるファイルがあります。そこにはいくつかのクラスがあります。 ApplicationUser
とApplicationDbContext
。 Items
のコレクションを追加するには、これが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
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;
他の誰かがこのような状況を持っている場合:私は私のユーザーがまだサインインしていないように私のアプリにログインするためのEメール検証を作成しています。
ApplicationUser user = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindByEmail(Email.Text);
次のものも必要になります。
using Microsoft.AspNet.Identity;
そして
using Microsoft.AspNet.Identity.Owin;
.Net MVC5コア2.2では、HttpContext.User.Identity.Nameを使用します。それは私のために働いた。
私はあなたの痛みを感じます、私は同じことをやろうとしています。私の場合は、ユーザーをクリアしたいだけです。
私は全てのコントローラが継承する基本コントローラクラスを作成しました。その中で私は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;
}
}
...
}