Как получить идентификатор пользователя объекта пользователя в 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);
обычно вы можете просто использовать WebSecurity.currentUserId
, но если вы находитесь в AccountController сразу после создания учетной записи, и вы хотите использовать идентификатор пользователя, чтобы связать пользователя с некоторыми данными в других таблицах, то WebSecurity.currentUserId
(и все решения выше), к сожалению, в этом случае возвращает -1, так это не работает.
к счастью, в этом случае у вас есть контекст db для таблицы UserProfiles, поэтому вы можете получить идентификатор пользователя следующим образом:
UserProfile profile = db.UserProfiles.Where(
u => u.UserName.Equals(model.UserName)
).SingleOrDefault();
я наткнулся на это дело недавно и этот ответ сэкономил бы мне кучу времени, так что просто положить его там.