Я использую MVC5 Identity 2.0, чтобы пользователи могли входить на мой веб-сайт, где данные аутентификации хранятся в базе данных SQL. Asp.net Identity реализован стандартным образом, что можно найти во многих онлайн-руководствах.
Класс ApplicationUser в IdentityModels был расширен за счет включения некоторых настраиваемых свойств, таких как целое число OrganizationId. Идея состоит в том, что можно создать множество пользователей и назначить их в общую организацию для целей взаимосвязи с базой данных.
public class ApplicationUser : IdentityUser
{
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> 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 текущего вошедшего в систему пользователя из контроллера? Доступно ли это с помощью метода после входа пользователя в систему, или я всегда получаю OrganizationId из базы данных на основе UserId каждый раз, когда выполняется метод контроллера?
Читая в Интернете, я видел, что мне нужно использовать следующее, чтобы войти в UserId и т. Д.
using Microsoft.AspNet.Identity;
...
User.Identity.GetUserId();
Однако OrganizationId не является свойством, доступным в User.Identity. Нужно ли мне расширять User.Identity, чтобы включить свойство OrganizationId? Если да, то как мне это сделать?
Причина, по которой мне так часто нужен OrganizationId, заключается в том, что многие запросы к таблицам зависят от OrganizationId для получения данных, относящихся к организации, связанной с вошедшим в систему пользователем.
Ответы:
Каждый раз, когда вы хотите расширить свойства User.Identity любыми дополнительными свойствами, подобными указанному выше, сначала добавьте эти свойства в класс ApplicationUser следующим образом:
Тогда вам нужно создать такой метод расширения (я создаю свой в новой папке Extensions):
Когда вы создаете Identity в классе ApplicationUser, просто добавьте Claim -> OrganizationId следующим образом:
После того, как вы добавили утверждение и разместили свой метод расширения, чтобы сделать его доступным в качестве свойства на вашем User.Identity, добавьте оператор using на страницу / файл, к которому вы хотите получить доступ :
в моем случае:
using App.Extensions;
внутри контроллера и@using. App.Extensions
в файле просмотра .cshtml.РЕДАКТИРОВАТЬ:
Что вы также можете сделать, чтобы избежать добавления оператора using в каждый View, так это перейти в папку Views и найти там файл Web.config. Теперь найдите
<namespaces>
тег и добавьте туда свое пространство имен расширения, например:Сохраните файл, и все готово. Теперь каждое представление будет знать о ваших расширениях.
Вы можете получить доступ к методу расширения:
источник
Я искал такое же решение, и Павел дал мне 99% ответа. Единственное, чего мне не хватало для отображения расширения, так это добавления следующего кода Razor на страницу cshtml (просмотр):
@using programname.Models.Extensions
Я искал имя, которое будет отображаться в правом верхнем углу панели навигации после входа пользователя в систему.
Я думал, что опубликую это, если это поможет кому-то другому, Итак, вот мой код:
Я создал новую папку под названием Extensions (в папке с моими моделями) и создал новый класс как Pawel, указанный выше:
IdentityExtensions.cs
IdentityModels.cs
:Затем в моем
_LoginPartial.cshtml
(ПодViews/Shared
папками) я добавил@using.ProgramName.Models.Extensions
Затем я добавил изменение в следующую строку кода, которая должна была использовать имя пользователя после входа в систему:
@Html.ActionLink("Hello " + User.Identity.GetUserFirstname() + "!", "Index", "Manage", routeValues: null, htmlAttributes: new { title = "Manage" })
Возможно, это поможет кому-то еще в будущем.
источник
Ознакомьтесь с этим замечательным сообщением в блоге Джона Аттена: ASP.NET Identity 2.0: настройка пользователей и ролей
В нем есть отличная пошаговая информация обо всем процессе. Иди, прочти :)
Вот некоторые основы.
Расширьте класс ApplicationUser по умолчанию, добавив новые свойства (например, адрес, город, штат и т. Д.):
Затем вы добавляете свои новые свойства в свой RegisterViewModel.
Затем обновите представление реестра, чтобы включить новые свойства.
Затем обновите метод Register () в AccountController новыми свойствами.
источник
Для тех, кто задает этот вопрос и ищет, как получить доступ к настраиваемым свойствам в ASP.NET Core 2.1 - это намного проще: у вас будет UserManager, например, в _LoginPartial.cshtml, а затем вы можете просто сделать (при условии, что «ScreenName» - это свойство, которое вы добавили в свой собственный AppUser, наследуемый от IdentityUser):
источник
GetUserAsync(User)
будет запрашиваться база данных для получения OrganizationId. Напротив, принятое решение будет включать в утверждения OrganizationId (например, cookie). Преимущество извлечения этой информации из базы данных заключается в том, что людей можно перемещать между организациями, не требуя от них выхода / входа в систему. Конечно, недостатком является то, что для этого требуется дополнительный запрос к базе данных.Dhaust дает хороший способ добавить свойство в класс ApplicationUser. Глядя на код OP, кажется, что они могли это сделать или были на правильном пути. Вопрос задает
Pawel позволяет добавить метод расширения, который требует использования операторов или добавления пространства имен в файл web.config.
Однако возникает вопрос, нужно ли вам расширять User.Identity для включения нового свойства. Существует альтернативный способ доступа к свойству без расширения User.Identity. Если вы следовали методу Dhaust, вы можете использовать следующий код в своем контроллере для доступа к новому свойству.
источник
Я также добавил или расширил дополнительные столбцы в свою таблицу AspNetUsers. Когда я хотел просто просмотреть эти данные, я нашел много примеров, таких как приведенный выше код с «Расширениями» и т. Д. Меня действительно поразило то, что вам пришлось написать все эти строки кода только для того, чтобы получить пару значений от текущих пользователей.
Оказывается, вы можете запросить таблицу AspNetUsers, как любую другую таблицу:
источник