Как расширить доступные свойства User.Identity

Я использую MVC5 Identity 2.0 для входа на мой сайт, где данные аутентификации хранятся в базе данных SQL. Идентификация Asp.net была реализована стандартным способом, как это можно найти во многих онлайн-учебниках.

Класс ApplicationUser в IdentityModels был расширен, чтобы включить некоторые настраиваемые свойства, такие как целое OrganizationId. Идея заключается в том, что многие пользователи могут быть созданы и назначены для общей организации отношений с базой данных.

public class ApplicationUser : IdentityUser { public async Task GenerateUserIdentityAsync(UserManager manager) { // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie); // Add custom user claims here return userIdentity; } //Extended Properties public DateTime? BirthDate { get; set; } public long? OrganizationId { get; set; } //Key Mappings [ForeignKey("OrganizationId")] public virtual Organization Organization { get; set; } } 

Как я могу получить свойство OrganizationId текущего пользователя, входящего в систему, из controllerа? Доступно ли это методом, когда пользователь вошел в систему, или всегда ли я получаю OrganizationId из базы данных на основе UserId каждый раз, когда выполняется метод controllerа?

Просматривая в Интернете, я видел, что мне нужно использовать следующее для входа в UserId и т. Д.

 using Microsoft.AspNet.Identity; ... User.Identity.GetUserId(); 

Однако OrganizationId не является свойством, доступным в User.Identity. Нужно ли расширять User.Identity, чтобы включить свойство OrganizationId? Если да, то как это сделать?

Причина, по которой я нуждаюсь в OrganID так часто, заключается в том, что многие запросы таблицы зависят от OrganizationId для извлечения данных, относящихся к Организации, связанных с зарегистрированным пользователем.

Всякий раз, когда вы хотите расширить свойства User.Identity с любыми дополнительными свойствами, такими как вопрос выше, сначала добавьте эти свойства в class ApplicationUser следующим образом:

 public class ApplicationUser : IdentityUser { public async Task GenerateUserIdentityAsync(UserManager manager) { // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie); // Add custom user claims here return userIdentity; } // Your Extended Properties public long? OrganizationId { get; set; } } 

Тогда вам нужно создать такой метод расширения (создаю мой в новой папке «Расширения»):

 namespace App.Extensions { public static class IdentityExtensions { public static string GetOrganizationId(this IIdentity identity) { var claim = ((ClaimsIdentity)identity).FindFirst("OrganizationId"); // Test for null to avoid issues during local testing return (claim != null) ? claim.Value : string.Empty; } } } 

Когда вы создаете Identity в classе ApplicationUser, просто добавьте Claim -> OrganizationId так:

  public async Task GenerateUserIdentityAsync(UserManager manager) { // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie); // Add custom user claims here => this.OrganizationId is a value stored in database against the user userIdentity.AddClaim(new Claim("OrganizationId", this.OrganizationId.ToString())); return userIdentity; } 

После того, как вы добавили претензию и используете свой метод расширения, чтобы сделать его доступным как свойство в вашем User.Identity, добавьте инструкцию using на странице / файле, к которой вы хотите получить доступ :

в моем случае: using App.Extensions; внутри controllerа и @using. App.Extensions @using. App.Extensions с .cshtml Просмотр файла.

РЕДАКТИРОВАТЬ:

То, что вы также можете сделать, чтобы не добавлять инструкцию использования в каждом представлении, – это перейти в папку «Представления» и найти там файл Web.config. Теперь найдите и добавьте пространство имен расширений там так:

  

Сохраните файл, и все готово. Теперь каждый вид будет знать ваши расширения.

Вы можете получить доступ к методу расширения:

 var orgId = User.Identity.GetOrganizationId(); 

Надеюсь, что кто-то поможет 🙂

Я искал одно и то же решение, и Павел дал мне 99% ответа. Единственное, чего не хватало для расширения для отображения, было добавление следующего кода Razor на страницу cshtml (view):

@using programname.Models.Extensions

Я искал FirstName, чтобы отобразить в правом верхнем углу моего NavBar после входа пользователя в систему.

Я думал, что отправлю это сообщение, это поможет кому-то другому, вот мой код:

Я создал новую папку под названием Extensions (под моей моделью) и создал новый class как Pawel, указанный выше: IdentityExtensions.cs

 using System.Security.Claims; using System.Security.Principal; namespace ProgramName.Models.Extensions { public static class IdentityExtensions { public static string GetUserFirstname(this IIdentity identity) { var claim = ((ClaimsIdentity)identity).FindFirst("FirstName"); // Test for null to avoid issues during local testing return (claim != null) ? claim.Value : string.Empty; } } } 

IdentityModels.cs :

 public class ApplicationUser : IdentityUser { //Extended Properties public string FirstName { get; internal set; } public string Surname { get; internal set; } public bool isAuthorized { get; set; } public bool isActive { get; set; } public async Task GenerateUserIdentityAsync(UserManager manager) { // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie); // Add custom user claims here userIdentity.AddClaim(new Claim("FirstName", this.FirstName)); return userIdentity; } } 

Затем в моем _LoginPartial.cshtml (в разделе « Views/Shared папки») я добавил @using.ProgramName.Models.Extensions

Затем я добавил изменение в строку вывода кода, которая будет использовать имя пользователя First после входа в систему:

@Html.ActionLink("Hello " + User.Identity.GetUserFirstname() + "!", "Index", "Manage", routeValues: null, htmlAttributes: new { title = "Manage" })

Возможно, это помогает кому-то еще по очереди.

Проверьте это замечательное сообщение в блоге Джоном Аттеном: ASP.NET Identity 2.0: настройка пользователей и роли

Он имеет отличную пошаговую информацию по всему процессу. Пойдите, прочитайте это:)

Вот некоторые из основ.

Расширьте class ApplicationUser по умолчанию, добавив новые свойства (например, адрес, город, штат и т. Д.):

 public class ApplicationUser : IdentityUser { public async Task GenerateUserIdentityAsync(UserManager manager) { var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie); return userIdentity; } public string Address { get; set; } public string City { get; set; } public string State { get; set; } // Use a sensible display name for views: [Display(Name = "Postal Code")] public string PostalCode { get; set; } // Concatenate the address info for display in tables and such: public string DisplayAddress { get { string dspAddress = string.IsNullOrWhiteSpace(this.Address) ? "" : this.Address; string dspCity = string.IsNullOrWhiteSpace(this.City) ? "" : this.City; string dspState = string.IsNullOrWhiteSpace(this.State) ? "" : this.State; string dspPostalCode = string.IsNullOrWhiteSpace(this.PostalCode) ? "" : this.PostalCode; return string.Format("{0} {1} {2} {3}", dspAddress, dspCity, dspState, dspPostalCode); } } 

Затем вы добавляете свои новые свойства в свой RegisterViewModel.

  // Add the new address properties: public string Address { get; set; } public string City { get; set; } public string State { get; set; } 

Затем обновите представление реестра, чтобы включить новые свойства.

  
@Html.LabelFor(m => m.Address, new { @class = "col-md-2 control-label" })
@Html.TextBoxFor(m => m.Address, new { @class = "form-control" })

Затем обновите метод Register () на AccountController с новыми свойствами.

  // Add the Address properties: user.Address = model.Address; user.City = model.City; user.State = model.State; user.PostalCode = model.PostalCode; 

DULT дает хороший способ добавить свойство в class ApplicationUser. Глядя на код OP, похоже, они, возможно, сделали это или были на пути к этому. Вопрос задает вопрос

Как я могу получить свойство OrganizationId текущего пользователя, входящего в систему, из controllerа? Однако OrganizationId не является свойством, доступным в User.Identity. Нужно ли расширять User.Identity, чтобы включить свойство OrganizationId?

Pawel дает возможность добавить метод расширения, который требует использования операторов или добавления пространства имен в файл web.config.

Однако в вопросе возникает вопрос, нужно ли вам «расширить» User.Identity, чтобы включить новое свойство. Существует альтернативный способ доступа к объекту без расширения User.Identity. Если вы следовали методу DULT, вы можете использовать следующий код в своем controllerе для доступа к новому свойству.

 ApplicationDbContext db = new ApplicationDbContext(); var manager = new UserManager(new UserStore(db)); var currentUser = manager.FindById(User.Identity.GetUserId()); var myNewProperty = currentUser.OrganizationId; 

Я также добавил или добавил дополнительные столбцы в таблицу AspNetUsers. Когда я хотел просто просмотреть эти данные, я нашел много примеров, таких как код выше с «Расширениями» и т. Д. Это действительно поразило меня, что вам нужно было написать все эти строки кода, чтобы получить пару значений от текущих пользователей.

Оказывается, вы можете запрашивать таблицу AspNetUsers, как и любую другую таблицу:

  ApplicationDbContext db = new ApplicationDbContext(); var user = db.Users.Where(x => x.UserName == User.Identity.Name).FirstOrDefault(); 

Для тех, кто находит этот вопрос в поиске доступа к настраиваемым свойствам в ASP.NET Core 2.1 – это намного проще: у вас будет UserManager, например, в _LoginPartial.cshtml, а затем вы можете просто сделать (если «ScreenName» – это которое вы добавили в свой собственный AppUser, который наследуется от IdentityUser):

 @using Microsoft.AspNetCore.Identity @using  @inject SignInManager SignInManager @inject UserManager UserManager @if (SignInManager.IsSignedIn(User)) { 
} else { }
  • Как обновить токен доступа с помощью токена обновления?
  • Идентификационные данные пользователя MVC 5 Access Identity
  • Получение электронной почты от внешних поставщиков Google и Facebook во время подключения к учетной записи в приложении MVC5 по умолчанию
  • Что такое интерфейс IUserSecurityStampStore ASP.NET Identity?
  • Нужен ли мне файл Global.asax.cs вообще, если я использую class OWIN Startup.cs и перемещаю туда всю конфигурацию?
  • В чем преимущество использования async с MVC5?
  • обновление с MVC4 до MVC5
  • Почему новый fb api 2.4 возвращает нулевой адрес электронной почты на MVC 5 с Identity и oauth 2?
  • Имя пользователя ASP.Net для электронной почты
  • Создание и запуск проекта MVC 5 в VS 2012
  • Ошибка проверки подлинности Asp.net
  • Давайте будем гением компьютера.