Членство в ASP.NET: где хранится текущий идентификатор пользователя? - PullRequest
5 голосов
/ 14 января 2012

Используя членство в ASP.NET, если я хочу получить информацию для текущего пользователя, я могу позвонить MembershipUser.GetUser()

Итак, каким-то образом система должна знать идентификатор текущего пользователя.

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

Я знаю, что могу получить имя пользователя текущего пользователя, используя User.Identity.Name, но мне нужен идентификатор.

Ответы [ 6 ]

10 голосов
/ 14 января 2012

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

    MembershipUser user = Membership.GetUser();
    string UserID = user.ProviderUserKey.ToString();

Но если вы хотите иметь метод или свойстводля получения только идентификатора пользователя, вы должны повторно реализовать свой собственный поставщик членства или (это просто) реализовать интерфейс IPrincipal

2 голосов
/ 04 марта 2014

Чтобы вернуть UserId, используйте команду ниже в вашем контроллере:

User.Identity.GetUserId();

Чтобы вернуть имя пользователя, используйте:

User.Identity.Name;

Чтобы вернуть пользователя:

var user = db.Users.Find(User.Identity.GetUserId());

Пожалуйста, обратитесь к сообщению: Как получить текущий пользователь и как использовать класс пользователя в MVC5?

1 голос
/ 14 января 2012

Как вы уже догадались, API членства не поддерживает то, что вы хотите, из коробки. В прошлом я использовал вспомогательный класс вместо создания собственного провайдера. В этом случае все довольно просто, может быть, что-то вроде этого:

public static object GetUserId() {
  return GetUserId(HttpContext.Current.User.Identity.Name, true);
}    
public static object GetUserId(string userName) {
  return GetUserId(userName, true);
}
public static object GetUserId(string userName, bool UpdateLastActivity) {
  using (SqlConnection c = new SqlConnection(CONNECTION_STRING)) {
    string sql = @"
DECLARE @UserId uniqueidentifier
SELECT @UserId=u.UserId
FROM dbo.aspnet_Applications AS a
  ,dbo.aspnet_Users AS u
  ,dbo.aspnet_Membership AS m
WHERE
  a.LoweredApplicationName=LOWER(@ApplicationName)
  AND u.ApplicationId=a.ApplicationId
  AND u.LoweredUserName=LOWER(@UserName)
  AND u.UserId=m.UserId;
IF @UserId IS NOT NULL AND @UpdateLastActivity=1
  UPDATE dbo.aspnet_Users
  SET LastActivityDate=@CurrentTimeUtc
  WHERE UserId=@UserId;
SELECT @UserId  
      ";
    using (SqlCommand cmd = new SqlCommand(sql, c)) {
      cmd.Parameters.AddWithValue("@ApplicationName", Roles.ApplicationName);
      cmd.Parameters.AddWithValue("@UserName", userName);
      cmd.Parameters.AddWithValue("@UpdateLastActivity", UpdateLastActivity);
      cmd.Parameters.AddWithValue("@CurrentTimeUtc", DateTime.UtcNow);
      object id = null;
      c.Open();
      id = cmd.ExecuteScalar();
      return id != DBNull.Value ? id : null;
    }
  }
}

Выше очень похоже на то, что сделано в API членства при вызове GetUser()

0 голосов
/ 16 сентября 2013

Рассмотрим

int userId = WebSecurity.CurrentUserId;

Кредит: https://stackoverflow.com/a/15382691/1268910

0 голосов
/ 14 января 2012

После изучения этого вопроса создается впечатление, что API-интерфейс членства в ASP.NET не отслеживает идентификатор пользователя. Он должен отслеживать только имя пользователя (User.Identity.Name). Идентификатор не требуется, поскольку Membership.GetUser() может найти пользователя по идентификатору или имени пользователя.

На самом деле, Membership.GetUser() просто нужно перевести на Membership.GetUser(User.Identity.Name). Поскольку он может получить текущего пользователя по имени пользователя, больше нет никаких оснований предполагать, что текущий идентификатор пользователя хранится в любом месте.

Таким образом, похоже, что идентификатор не загружен в память, и единственный способ получить идентификатор - это загрузить данные из базы данных (что означает загрузку всей пользовательской записи при использовании API членства в ASP.NET).

0 голосов
/ 14 января 2012

Вы можете использовать MembershipUser.UserName, чтобы получить идентификатор пользователя или попробовать позвонить Membership.GetUser(User.Identity.Name) и посмотреть, подходит ли вам это.

...