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

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

Ответ 1

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

Guid userGuid = (Guid)Membership.GetUser().ProviderUserKey;

Ответ 2

Вот решение:

Включить:

using Microsoft.AspNet.Identity;

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

User.Identity.GetUserId();

Ответ 3

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


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

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

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

Бонусный ответ/предложение

Таким образом, я бы сделал CACHE, поэтому вам не нужно продолжать попадание в базу данных.

... cont from above....
Guid guid = (Guid)user.ProviderUserKey;

Cache.Add(User.Identity.Name, user.UserID); // Key: Username; Value: Guid.

В противном случае вы можете создать свой собственный класс Identity (который наследуется от IIdentity) и добавлять свои собственные пользовательские свойства, например UserID, Затем, всякий раз, когда вы выполняете аутентификацию (а также по каждому запросу), вы можете установить это значение. Во всяком случае, это твердое решение, поэтому идем с кэшированием прямо сейчас.

НТН

Ответ 4

User.Identity является IPrincipal - типично типа System.Web.Security.FormsIdentity

Он ничего не знает о UserIDs - это просто абстракция понятия "идентичность".

Интерфейс IIdentity имеет только имя для пользователя, даже не "Username".

Если вы используете MVC4 со стандартным SimpleMembershipProvider, вы можете сделать это:

WebSecurity.GetUserId(User.Identity.Name)   // User is on ControllerBase

(Где WebSecurity находится в пакете nuget Microsoft.AspNet.WebPages.WebData в WebMatrix

Вы также можете использовать

WebSecurity.CurrentUserName
WebSecurity.CurrentUserId

(если вы используете ASPNetMembershipProvider, который является более старой более сложной системой членства ASPNET, а затем см. ответ by @eduncan911)

Ответ 5

Если вы используете членство 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;
  }
}

Ответ 6

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

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

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

}

Ответ 7

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

Например:

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

    //...Other IPrincipal stuff
}

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

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

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

Ответ 8

using System.Web.Security;

MembershipUser user = Membership.GetUser(User.Identity.Name); 
int id = Convert.ToInt32(user.ProviderUserKey);

Ответ 9

Свойство ProviderUserKey.

System.Web.Security.MembershipUser u;
u.ProviderUserKey

Ответ 10

Простой....

int userID = WebSecurity.CurrentUserId;

Ответ 11

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

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

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

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