1. ホーム
  2. asp.net

[解決済み] MVC 5 アクセス クレーム アイデンティティ ユーザーデータ

2022-07-17 10:22:57

質問

私は MVC 5 を使ったウェブアプリケーションを開発しています。 Entity Framework 5 データベースファースト のアプローチを使用しています。私は 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 を作成し、それにいくつかのクレームを追加し、それを OWIN を使って AuthenticationManager を使用してサインインを実行します。

私が抱えている問題は、私のアプリケーションの残りの部分、コントローラまたはRazor Viewsのいずれかで、クレームにアクセスする方法がわからないということです。

私はこのチュートリアルに記載されているアプローチを試しました。

http://brockallen.com/2013/10/24/a-primer-on-owin-cookie-authentication-middleware-for-the-asp-net-developer/

例えば、Claimsに渡された値にアクセスするために、Controllerのコードで以下のように試してみました。

var ctx = HttpContext.GetOwinContext();
ClaimsPrincipal user = ctx.Authentication.User;
IEnumerable<Claim> claims = user.Claims;

おそらく、私はここで何かを見逃しているのでしょう。

アップデイト

Darinの回答に基づいて、彼のコードを追加しましたが、まだClaimsへのアクセスは表示されません。以下のスクリーンショットは、identity.Claimsにカーソルを置いたときに表示されるものを示しています。

どのように解決するのですか?

これを試してみてください。

[Authorize]
public ActionResult SomeAction()
{
    var identity = (ClaimsIdentity)User.Identity;
    IEnumerable<Claim> claims = identity.Claims;
    ...
}