У меня есть несколько таблиц с идентификатором UserID, который относится к aspnet_Users.UserID. Когда пользователь отправляет некоторые данные для этих таблиц, поскольку у метода контроллера есть [Авторизовать], я получаю объект User. Я могу получить имя пользователя с именем User.Identity.Name, но как получить идентификатор пользователя для установления отношения (владельца)?
Как вы получаете UserID объекта User в ASP.Net MVC?
Ответ 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();
Недавно я встретил это дело, и этот ответ спас бы мне целую кучу времени, поэтому просто поместив его туда.