Как получить UserID объекта User в ASP.Net MVC?

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


person pupeno    schedule 29.05.2009    source источник
comment
вопрос на самом деле не имеет ничего общего с mvc, поэтому я изменил тег с asp-net-mvc на asp-net, чтобы привлечь внимание аудитории.   -  person Kris    schedule 30.05.2009
comment
Крис, ASP.Net MVC предоставляет объект User, который, я думаю, не предоставляет ASP.Net. Я ошибся?   -  person pupeno    schedule 30.05.2009
comment
Да, ты не прав. Крис прав. это вещь ASP.NET, а не только ASP.NET MVC.   -  person Pure.Krome    schedule 30.05.2009


Ответы (10)


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

Guid userGuid = (Guid)Membership.GetUser().ProviderUserKey;
person pupeno    schedule 29.05.2009
comment
Действительно? это не требует строки? /me проверяет msdn: msdn.microsoft.com /en-us/библиотека/ . Дерьмо! ты прав! хорошая находка :) - person Pure.Krome; 30.05.2009
comment
В представленном материале OAuth это не работает (возвращается ноль). В ASP.Net 4 MVC вы можете использовать свойство WebSecurity.CurrentUserId. - person Dan; 15.10.2012
comment
@Dann кажется, что в ASP.Net MVC 5 это больше не работает, или они изменили операторы использования (использовали System.Web.Security). Любые идеи? - person Jed Grant; 09.08.2013
comment
Решение MVC 5: stackoverflow.com/questions/18448637/ - person Adam Szabo; 26.08.2013

Вот решение:

Включают:

using Microsoft.AspNet.Identity;

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

User.Identity.GetUserId();
person faisale    schedule 30.01.2014

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

ХТН

person Pure.Krome    schedule 29.05.2009
comment
Это способ сделать это? Сделать имя пользователя уникальным? Зачем нам тогда вообще идентификаторы? - person pupeno; 29.05.2009
comment
OT: Почему вы утверждаете, что членство в ASP.NET — это зло? - person eduncan911; 30.05.2009
comment
@Eric: потому что я лично считаю, что это слишком сложное решение для большинства сценариев. Например, сколько раз вы видели решение, которое использует общий сервер sql, где пользователи совместно используются в базах данных на том же сервере sql? Все эти таблицы и сохраненные процедуры, которые можно сократить до одной или двух для большинства людей, использующих сценарий. Резюме: массивное раздувание. Над инженерридом. Примечание: теперь OpenID FTW :) - person Pure.Krome; 30.05.2009
comment
@Дж. Пабло: нет, приятель. Идентификатор — это главное, что является уникальным, но Membership.GetUser(string) получает пользователя по предоставленной строке —> как правило, его имени пользователя. Если вы не предоставите эту строку, она использует текущее значение для того, кто вошел в систему, предполагая, что кто-то вошел в систему. Это значение эквивалентно User.Identity.Name. - person Pure.Krome; 30.05.2009

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)

person Simon_Weaver    schedule 17.01.2013
comment
+1 за 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;
  }
}
person eduncan911    schedule 29.05.2009

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

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

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

}
person user3175805    schedule 09.01.2014

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

Например:

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

    //...Other IPrincipal stuff
}

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

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

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

person ebrown    schedule 29.05.2009

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

System.Web.Security.MembershipUser u;
u.ProviderUserKey
person Alex    schedule 29.05.2009
comment
Как мне заставить вас быть текущим зарегистрированным пользователем? - person pupeno; 29.05.2009

Простой....

int userID = WebSecurity.CurrentUserId;
person Izztraab    schedule 05.08.2013
comment
Хотя это одно из наиболее полезных решений, этот ответ был рассмотрен в ответе Simon_Weaver (7 месяцев назад). - person Gone Coding; 23.10.2013

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

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

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

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

person james_s_tayler    schedule 15.12.2015