MVC 5 访问声明身份用户数据

133

我正在使用 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视图中)访问这些声明。

我尝试了本教程中列出的方法:

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

例如,在我的控制器代码中,我尝试获取传递到声明中的值,但是user.Claims等于null。

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

也许我在这里漏掉了什么。

更新

根据Darin的回答,我添加了他的代码,但我仍然没有看到访问Claims的权限。请参见下面的屏幕截图,显示当我悬停在identity.Claims上时看到的内容。

输入图像描述


你能确认浏览器是否发送了 cookie 吗?也许你的安全设置要求 SSL? - leastprivilege
@leastprivilege 谢谢,我现在会去看一下。我在Stackoverflow上找到了这个问题,https://dev59.com/ynnZa4cB1Zd3GeqPuMNu?rq=1 它和我遇到的问题完全相同,但不幸的是没有答案 :( - tcode
你的OWIN组件是如何初始化的? - Derek Van Cuyk
我最近遇到了这样的问题;希望这个解决方案能有所帮助:http://stackoverflow.com/questions/34537475/owin-identity-roles-work-locally-but-seem-to-disappear-when-i-publish-run-the-s/34548579#34548579 - Alexandru
12个回答

1
var claim = User.Claims.FirstOrDefault(c => c.Type == "claim type here");

0
我在我的基础控制器中使用它。只是分享给准备好使用的人。
    public string GetCurrentUserEmail() {
        var identity = (ClaimsIdentity)User.Identity;
        IEnumerable<Claim> claims = identity.Claims;
        var email = claims.Where(c => c.Type == ClaimTypes.Email).ToList();
        return email[0].Value.ToString();
    }

    public string GetCurrentUserRole()
    {
        var identity = (ClaimsIdentity)User.Identity;
        IEnumerable<Claim> claims = identity.Claims;
        var role = claims.Where(c => c.Type == ClaimTypes.Role).ToList();
        return role[0].Value.ToString();
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接