У меня есть несколько таблиц с уникальным идентификатором UserID, который относится к aspnet_Users.UserID. Когда пользователь отправляет некоторые данные для этих таблиц, поскольку метод контроллера имеет [Authorize], я получаю объект User. Я могу получить имя пользователя с помощью User.Identity.Name, но как мне получить UserID, чтобы установить отношения (владение)?

73
pupeno 29 Май 2009 в 10:45

11 ответов

Лучший ответ

Кажется, вы не можете получить его из объекта User, но вы можете получить его следующим образом:

Guid userGuid = (Guid)Membership.GetUser().ProviderUserKey;
87
pupeno 29 Май 2009 в 19:58

Вот решение:

Включают:

using Microsoft.AspNet.Identity;

Затем используйте методы расширения:

User.Identity.GetUserId();
30
faisale 30 Янв 2014 в 12:55

Во-первых, этот ответ не является строго ответом MVC, а является ответом ASP.NET. Тот факт, что ваш сайт является MVC, в этом случае не имеет отношения к решению проблемы.


Хм. Я не совсем уверен, как вы обращаетесь со своими пользователями в своей системе, но похоже, что вы используете (очень злой) asp.net membership provider, который поставляется из коробки с .net. На это намекает тот факт, что вы сказали

  • aspnet_Users.UserID
  • UserID - это уникальный идентификатор (читается: GUID).

С системой аутентификации форм по умолчанию, которая использует по умолчанию FormsIdentity < / a>, у него есть только одно свойство с именем Имя (как вы правильно заметили). Это означает, что у него есть только одно значение, в котором можно разместить уникальную информацию о пользователе. В вашем случае вы указываете 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. Затем при каждой аутентификации (а также при каждом запросе) вы можете установить это значение. В любом случае, это серьезное решение, так что приступайте к кешированию прямо сейчас.

HTH

27
Gone Coding 23 Окт 2013 в 13:20

User.Identity - это IPrincipal - обычно типа System.Web.Security.FormsIdentity

Он ничего не знает о UserID - это просто абстракция концепции «идентичности».

Интерфейс 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)

18
Simon_Weaver 13 Май 2015 в 21:39

Если вы используете членство в 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;
  }
}
11
eduncan911 29 Май 2009 в 20:08

Лучший способ получить идентификатор пользователя

Добавить ниже ссылки

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

}
6
user3175805 9 Янв 2014 в 02:39

Если вы используете свой собственный объект IPrincipal для авторизации, вам просто нужно преобразовать его для доступа к Id.

Например:

public class MyCustomUser : IPrincipal
{
    public int UserId {get;set;}

    //...Other IPrincipal stuff
}

Вот отличный учебник по созданию собственной аутентификации на основе форм.

http://www.codeproject.com/KB/web-security/AspNetCustomAuth.aspx

Это должно дать вам правильный путь к созданию файла cookie аутентификации для вашего пользователя и доступу к вашим пользовательским данным.

3
ebrown 29 Май 2009 в 14:39
using System.Web.Security;

MembershipUser user = Membership.GetUser(User.Identity.Name); 
int id = Convert.ToInt32(user.ProviderUserKey);
2
Koraktor 28 Фев 2014 в 05:21

Это свойство ProviderUserKey.

System.Web.Security.MembershipUser u;
u.ProviderUserKey
1
Alex 29 Май 2009 в 07:17

Просто....

int userID = WebSecurity.CurrentUserId;
1
kleopatra 5 Авг 2013 в 10:00

Обычно вы можете просто использовать WebSecurity.currentUserId, но если вы находитесь в AccountController сразу после создания учетной записи и хотите использовать идентификатор пользователя, чтобы связать пользователя с некоторыми данными в других таблицах, тогда WebSecurity.currentUserId ( и все вышеперечисленные решения), к сожалению, в этом случае возвращается -1, поэтому он не работает.

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

UserProfile profile = db.UserProfiles.Where(
    u => u.UserName.Equals(model.UserName)
).SingleOrDefault();

Недавно я столкнулся с этим случаем, и этот ответ сэкономил бы мне кучу времени, поэтому просто выложите его там.

0
james_s_tayler 15 Дек 2015 в 10:55