У меня есть несколько таблиц с уникальным идентификатором UserID, который относится к aspnet_Users.UserID. Когда пользователь отправляет некоторые данные для этих таблиц, поскольку метод контроллера имеет [Authorize], я получаю объект пользователя. Я могу получить имя пользователя с помощью User.Identity.Name, но как мне получить UserID, чтобы иметь возможность установить отношения (владения)?
Как получить UserID объекта User в ASP.Net MVC?
Ответы (10)
Кажется, вы не можете получить его из объекта User, но вы можете получить его следующим образом:
Guid userGuid = (Guid)Membership.GetUser().ProviderUserKey;
Вот решение:
Включают:
using Microsoft.AspNet.Identity;
Затем используйте методы расширения:
User.Identity.GetUserId();
Во-первых, этот ответ строго не является ответом MVC, а является ответом ASP.NET. Тот факт, что ваш сайт является MVC, в данном случае не имеет отношения к решению проблемы.
Хм. Я не очень понимаю, как вы работаете со своими пользователями в вашей системе, но похоже, что вы используете (очень злой) asp.net membership provider
, который поставляется из коробки с .net. На это намекает тот факт, что вы сказали
- aspnet_Users.UserID
- UserID — это уникальный идентификатор (читай: GUID).
С системой проверки подлинности форм по умолчанию, которая использует FormsIdentity, у него есть только одно свойство с именем Имя (как вы правильно заметили). Это означает, что у него есть только одно значение, в которое можно поместить некоторую уникальную информацию о пользователе. В вашем случае вы помещаете Name/UserName/DisplayName в свойство Name
. Я предполагаю, что это имя является их отображаемым именем, и оно уникально. Какую бы ценность вы здесь ни указали, она ДОЛЖНА БЫТЬ УНИКАЛЬНОЙ.
Отсюда вы можете получить руководство пользователя.
Проверь это.
using System.Web.Security;
....
// NOTE: This is a static method .. which makes things easier to use.
MembershipUser user = Membership.GetUser(User.Identity.Name);
if (user == null)
{
throw new InvalidOperationException("User [" +
User.Identity.Name + " ] not found.");
}
// Do whatever u want with the unique identifier.
Guid guid = (Guid)user.ProviderUserKey;
Итак, каждый раз, когда вы хотите получить информацию о пользователе, вам нужно получить ее из базы данных, используя статический метод, описанный выше.
Прочтите все о классе членства и класс MembershipUser в MSDN.
Бонусный ответ/предложение
Таким образом, я бы КЭШИРОВАЛ этот результат, чтобы вам не нужно было постоянно обращаться к базе данных.
... cont from above....
Guid guid = (Guid)user.ProviderUserKey;
Cache.Add(User.Identity.Name, user.UserID); // Key: Username; Value: Guid.
В противном случае вы можете создать свой собственный класс Identity (который наследуется от IIdentity) и добавьте свои собственные свойства, например UserID
. Затем при каждой аутентификации (а также при каждом запросе) вы можете установить это значение. В любом случае, это жесткое решение, поэтому приступайте к кэшированию прямо сейчас.
ХТН
User.Identity
является IPrincipal
- обычно типа System.Web.Security.FormsIdentity
Он ничего не знает об идентификаторах пользователей — это просто абстракция понятия «личность».
Интерфейс IIdentity имеет только "Имя" для пользователь, даже не «имя пользователя».
Если вы используете MVC4 со значением по умолчанию SimpleMembershipProvider
вы можете сделать это:
WebSecurity.GetUserId(User.Identity.Name) // User is on ControllerBase
(Где WebSecurity
находится в пакете nuget Microsoft.AspNet.WebPages.WebData
в WebMatrix
Вы также можете использовать
WebSecurity.CurrentUserName
WebSecurity.CurrentUserId
(если вы используете более раннюю версию ASPNetMembershipProvider). сложная система членства в ASPNET, затем см. ответ @eduncan911)
WebSecurity.CurrentUserId
. Даже шаблонный AccountController использует WebSecurity.GetUserId(User.Identity.Name)
, что кажется немного глупым, когда у него есть CurrentUserId
.
- person Gone Coding; 23.10.2013
Если вы используете членство в ASP.NET (которое, в свою очередь, использует объект IPrincipal):
using System.Web.Security;
{
MembershipUser user = Membership.GetUser(HttpContext.User.Identity.Name);
Guid guid = (Guid)user.ProviderUserKey;
}
User.Identity всегда возвращает состояние текущего пользователя, вошедшего в систему или нет.
Анонимно или нет и т.д. Итак, чек на логин:
if (User.Identity.IsAuthenticated)
{
...
}
Итак, собираем все вместе:
using System.Web.Security;
{
if (User.Identity.IsAuthenticated)
{
MembershipUser user = Membership.GetUser(HttpContext.User.Identity.Name);
Guid guid = (Guid)user.ProviderUserKey;
}
}
Лучший способ получить идентификатор пользователя
Добавить ниже ссылки
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using Microsoft.Owin.Security;*
public myFunc()
{
.....
// Code which will give you user ID is
var tmp = User.Identity.GetUserId();
}
Если вы используете свой собственный объект IPrincipal для авторизации, вам просто нужно привести его для доступа к идентификатору.
Например:
public class MyCustomUser : IPrincipal
{
public int UserId {get;set;}
//...Other IPrincipal stuff
}
Вот отличный учебник по созданию собственной аутентификации на основе форм.
http://www.codeproject.com/KB/web-security/AspNetCustomAuth.aspx
Это должно привести вас на правильный путь к созданию файла cookie для проверки подлинности для вашего пользователя и доступа к вашим пользовательским данным.
Это свойство ProviderUserKey.
System.Web.Security.MembershipUser u;
u.ProviderUserKey
Простой....
int userID = WebSecurity.CurrentUserId;
Обычно вы можете просто использовать WebSecurity.currentUserId
, но если вы находитесь в AccountController сразу после создания учетной записи и хотите использовать идентификатор пользователя, чтобы связать пользователя с некоторыми данными в других таблицах, тогда WebSecurity.currentUserId
(и все решения выше), к сожалению, в этом случае возвращается -1, так что это не работает.
К счастью, в этом случае у вас есть удобный контекст БД для таблицы UserProfiles, поэтому вы можете получить идентификатор пользователя следующим образом:
UserProfile profile = db.UserProfiles.Where(
u => u.UserName.Equals(model.UserName)
).SingleOrDefault();
Недавно я столкнулся с этим случаем, и этот ответ сэкономил бы мне кучу времени, поэтому просто разместите его там.