Идентификационные данные пользователя MVC 5 Access Identity

Я разрабатываю веб-приложение MVC 5 с использованием подхода Entity Framework 5 Database First . Я использую OWIN для аутентификации пользователей. Ниже показан мой метод входа в мой controller учетных записей.

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 для выполнения входа.

Проблема, с которой я сталкиваюсь, заключается в том, что я не уверен, как получить доступ к претензиям в остальной части моего приложения, либо в controllerах, либо в Razor Views.

Я пробовал подход, указанный в этом учебнике

A primer on OWIN cookie authentication middleware for the ASP.NET developer

Например, я попробовал это в своем коде controllerа, пытаясь получить доступ к значениям, переданным в Претензии, однако user.Claims равен нулю

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

Возможно, я что-то упустил.

ОБНОВИТЬ

Основываясь на ответе Дарина, я добавил его код, но все же я не вижу доступа к претензиям. См. Снимок экрана ниже, показывающий, что я вижу, когда он зависает над личностью.

введите описание изображения здесь

Попробуй это:

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

Вы также можете сделать это:

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

Обновить

Предоставить дополнительные пояснения в соответствии с комментариями.

Если вы создаете пользователей в своей системе следующим образом:

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

Вы должны автоматически заполнить некоторые претензии, относящиеся к вам Identity.

Чтобы добавить индивидуальные претензии после аутентификации пользователя, вы можете сделать это следующим образом:

 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

Я делаю свой собственный расширенный class, чтобы увидеть, что мне нужно, поэтому, когда мне нужно в controller или мой просмотр, я добавляю только использование в свое пространство имен примерно так:

 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 .... { ..... } } 

В моем controllerе:

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

В моей бритве:

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

Это альтернатива, если вы не хотите постоянно использовать требования. Взгляните на этот урок Бен Фостер.

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

Затем вы можете добавить базовый controller.

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

В controllerе вы должны:

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

Вы также можете это сделать.

 IEnumerable claims = ClaimsPrincipal.Current.Claims; 

Чтобы более подробно остановиться на ответе Дарина, вы можете обратиться к своим конкретным требованиям с помощью метода FindFirst :

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

Однако лучше добавить претензии в метод «GenerateUserIdentityAsync», особенно если включена функция restoreateIdentity в Startup.Auth.cs.

Помните, что для запроса 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; 

Согласно classу ControllerBase, вы можете получить претензии для пользователя, выполняющего действие.

введите описание изображения здесь

вот как вы можете сделать это в 1 строке.

 var claims = User.Claims.ToList(); 
 var claim = User.Claims.FirstOrDefault(c => c.Type == "claim type here"); 
Давайте будем гением компьютера.