MVC 5访问声明标识用户数据

我正在开发一个MVC 5 Web应用程序使用entity framework5数据库优先的方法。 我正在使用OWIN进行用户身份validation。 下面显示我的帐户控制器中的我的login方法。

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); } 

正如你所看到的,我创build了一个ClaimsIdentity并添加了几个声明,然后使用AuthenticationManager将它传递给OWIN来执行login。

我遇到的问题是,我不知道如何访问我的应用程序的其余部分,无论是在控制器或在剃刀视图。

我曾尝试过本教程中列出的方法

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; 

也许我在这里错过了一些东西。

任何帮助将不胜感激,我很抱歉,如果这是一个新手的问​​题,这是我的第一次经验与OWIN和使用索赔身份。

谢谢。

UPDATE

根据达林的回答,我添加了他的代码,但是我仍然看不到索赔。 请看下面的屏幕截图,展示我在身份查验时看到的内容.Claims。

在这里输入图像说明

尝试这个:

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

你也可以这样做:

 //Get the current claims principal var identity = (ClaimsPrincipal)Thread.CurrentPrincipal; var claims = identity.Claims; 

更新

根据评论提供进一步的解释。

如果您正在系统中创build用户,如下所示:

 UserManager<applicationuser> userManager = new UserManager<applicationuser>(new UserStore<applicationuser>(new SecurityContext())); ClaimsIdentity identity = userManager.CreateIdentity(user, DefaultAuthenticationTypes.ApplicationCookie); 

您应该自动填写一些与您的身份有关的声明。

在用户validation后添加自定义声明,可以按如下方式进行:

 var user = userManager.Find(userName, password); identity.AddClaim(new Claim(ClaimTypes.Email, user.Email)); 

这些索赔可以回读出来,因为达林已经回答上面或者我已经有了。

当您打电话通过以下身份时,这些索赔仍然存在:

 AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = persistCookie }, identity); 

这篇文章更详细地描述了这一点,是特定于MVC 5,我知道的其他文章是针对MVC 4。

http://kevin-junghans.blogspot.co.uk/2013/12/using-claims-in-aspnet-identity.html

我做我自己的扩展类,看看我需要什么,所以当我需要到我的控制器或我的视图,我只join使用我的命名空间是这样的:

 public static class UserExtended { public static string GetFullName(this IPrincipal user) { var claim = ((ClaimsIdentity)user.Identity).FindFirst(ClaimTypes.Name); return claim == null ? null : claim.Value; } public static string GetAddress(this IPrincipal user) { var claim = ((ClaimsIdentity)user.Identity).FindFirst(ClaimTypes.StreetAddress); return claim == null ? null : claim.Value; } public .... { ..... } } 

在我的控制器中:

 using XXX.CodeHelpers.Extended; var claimAddress = User.GetAddress(); 

在我的剃刀:

 @using DinexWebSeller.CodeHelpers.Extended; @User.GetFullName() 

如果你不想总是使用索赔,这是一个替代scheme。 看一下Ben Foster的这个教程 。

 public class AppUser : ClaimsPrincipal { public AppUser(ClaimsPrincipal principal) : base(principal) { } public string Name { get { return this.FindFirst(ClaimTypes.Name).Value; } } } 

然后你可以添加一个基础控制器。

 public abstract class AppController : Controller { public AppUser CurrentUser { get { return new AppUser(this.User as ClaimsPrincipal); } } } 

在你的控制器中,你会这样做:

 public class HomeController : AppController { public ActionResult Index() { ViewBag.Name = CurrentUser.Name; return View(); } } 

你也可以做到这一点。

 IEnumerable<Claim> claims = ClaimsPrincipal.Current.Claims; 

为了进一步触及Darin的答案,可以使用FindFirst方法来获得具体的声明:

 var identity = (ClaimsIdentity)User.Identity; var role = identity.FindFirst(ClaimTypes.Role).Value; 
 Request.GetOwinContext().Authentication.User.Claims 

但是,最好在“GenerateUserIdentityAsync”方法中添加声明,特别是如果Startup.Auth.cs中的regenerateIdentity已启用。

请记住,为了查询IEnumerable,您需要引用system.linq。
它会给你扩展对象需要做的事情:

 CaimsList.FirstOrDefault(x=>x.Type =="variableName").toString(); 

最简单的@Rosdi Kasim'd答案是

 string claimvalue = ((System.Security.Claims.ClaimsIdentity)User.Identity). FindFirst("claimname").Value; 

Claimname是要检索的声明,即如果您正在寻找“StreedAddress”声明,那么上面的答案将是这样的

 string claimvalue = ((System.Security.Claims.ClaimsIdentity)User.Identity). FindFirst("StreedAddress").Value; 

根据ControllerBase类,您可以获取执行操作的用户的声明。

在这里输入图像说明

这里是你如何做到一行。

 var claims = User.Claims.ToList();