Как получить идентификатор пользователя объекта пользователя в ASP.Net MVC?

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

11 ответов


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

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

вот решение:

включает:

using Microsoft.AspNet.Identity;

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

User.Identity.GetUserId();

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


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

  • aspnet_Users.Имя пользователя
  • UserID является uniqueidentifier (читать: идентификатор GUID.)

С системой проверки подлинности форм по умолчанию, которая используетFormsIdentity, он имеет только одно свойство с именем имя (как вы правильно заметили). Это означает, что он имеет только одно значение, где разместить уникальную информацию пользователей. В вашем случае, вы ставите Имя / Имя Пользователя / DisplayName, в Name собственность. Я предполагаю, что это имя является их отображаемым именем, и оно уникально. Какую бы ценность вы ни вкладывали вот, оно!--21-->ДОЛЖЕН БЫТЬ УНИКАЛЬНЫМ.

из этого вы можете захватить guid пользователя.

зацени.

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.

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

HTH


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

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

на 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)


Если вы используете ASP.NET членство (которое в свою очередь использует объект IPrincipal):

using System.Web.Security;
{
  MembershipUser user = Membership.GetUser(HttpContext.User.Identity.Name);
  Guid guid = (Guid)user.ProviderUserKey;
}

пользователей.Личность всегда возвращает состояние текущего пользователя, вошедшего в систему или нет.

анонимный или нет, и т. д. Таким образом, проверка для входа в систему:

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 аутентификации для вашего пользователя и доступа к вашим пользовательским данным.


using System.Web.Security;

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

его свойство ProviderUserKey.

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

простой....

int userID = WebSecurity.CurrentUserId;

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

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

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

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