Entity Framework 5 Database Firstアプローチを使用してMVC 5 Webアプリケーションを開発しています。ユーザーの認証にOWINを使用しています。以下は、私のアカウントコントローラー内の私のログインメソッドを示しています。
public ActionResult Login(LoginViewModel model, string returnUrl)
{
if (ModelState.IsValid)
{
var user = _AccountService.VerifyPassword(model.UserName, model.Password, false);
if (user != null)
{
var identity = new ClaimsIdentity(new[] { new Claim(ClaimTypes.Name, model.UserName), }, DefaultAuthenticationTypes.ApplicationCookie, ClaimTypes.Name, ClaimTypes.Role);
identity.AddClaim(new Claim(ClaimTypes.Role, "guest"));
identity.AddClaim(new Claim(ClaimTypes.GivenName, "A Person"));
identity.AddClaim(new Claim(ClaimTypes.Sid, user.userID)); //OK to store userID here?
AuthenticationManager.SignIn(new AuthenticationProperties
{
IsPersistent = model.RememberMe
}, identity);
return RedirectToAction("Index", "MyDashboard");
}
else
{
ModelState.AddModelError("", "Invalid username or password.");
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
ご覧のとおり、ClaimsIdentityを作成し、それにいくつかのクレームを追加してから、AuthenticationManagerを使用してOWINに渡し、サインインを実行しています。
私が抱えている問題は、コントローラーまたはRazorビューで、アプリケーションの残りの部分のクレームにアクセスする方法がわからないことです。
このチュートリアルに記載されているアプローチを試しました
たとえば、クレームに渡された値にアクセスするために、コントローラーコードでこれを試しましたが、user.Claimsはnullに等しいです。
var ctx = HttpContext.GetOwinContext();
ClaimsPrincipal user = ctx.Authentication.User;
IEnumerable<Claim> claims = user.Claims;
おそらく私はここで何かを見逃している。
更新
ダリンの答えに基づいて、私は彼のコードを追加しましたが、それでもクレームへのアクセスを確認できません。identity.Claimsの上にマウスを置いたときに表示されるものを示す以下のスクリーンショットを参照してください。