Как вы получаете UserID объекта User в ASP.Net MVC? - PullRequest
72 голосов
/ 29 мая 2009

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

Ответы [ 11 ]

86 голосов
/ 29 мая 2009

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

Guid userGuid = (Guid)Membership.GetUser().ProviderUserKey;
30 голосов
/ 30 января 2014

Вот решение:

Включено:

using Microsoft.AspNet.Identity;

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

User.Identity.GetUserId();
27 голосов
/ 29 мая 2009

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


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

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

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

Итак, каждый раз, когда вы хотите получить информацию о пользователе, вам нужно извлечь ее из базы данных, используя статический метод, описанный выше.

Узнайте все о классе членства и членстве в классе на MSDN.

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

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

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

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

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

НТН

18 голосов
/ 17 января 2013

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)

11 голосов
/ 30 мая 2009

Если вы используете членство в 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 голосов
/ 09 января 2014

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

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

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

}
3 голосов
/ 29 мая 2009

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

Например:

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

    //...Other IPrincipal stuff
}

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

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

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

2 голосов
/ 27 февраля 2014
using System.Web.Security;

MembershipUser user = Membership.GetUser(User.Identity.Name); 
int id = Convert.ToInt32(user.ProviderUserKey);
1 голос
/ 05 августа 2013

Simple ....

int userID = WebSecurity.CurrentUserId;
1 голос
/ 29 мая 2009

Свойство ProviderUserKey.

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