2012-01-14 3 views
5

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

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

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

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

ответ

0

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

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

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

+0

Членство должно иметь свойство ProviderUserKey, которое вы можете использовать (Guid) при условии, что вы используете SQLMembershipProvider. – PilotBob

0

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

+0

Нет, это имя пользователя, а не Я БЫ. И мой вопрос заключался в том, как получить это, не получая все данные пользователя, что и делает ваше предложение. –

+0

Попробуйте использовать тот, который я опубликовал после моего редактирования 'Membership.GetUser (User.Identity.Name)' –

+0

Вы описали несколько способов сделать именно то, что я * не хочу делать. Возможно, вы не прочитали мой вопрос. –

10

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

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

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

1

Как вы уже догадались, 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 [email protected] 
    WHERE [email protected]; 
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; 
    } 
    } 
} 

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

+0

То, что я искал, было чем-то более легким, учитывая тот факт, что я мог видеть, что ASP.NET кэширует часть этой информации. Я действительно не вижу никакого преимущества в использовании вашего кода над чем-то простым, например 'Membership.GetUser(). ProviderUserKey'. –

+0

Если вы посмотрите хранимую процедуру 'aspnet_Membership_GetUserByName' в базе данных' aspnetdb', одно из запрошенных полей имеет тип данных 'ntext'. Вы не уточнили, что такое ваша установка, так что это может быть или не быть проблемой. Тем не менее, вам не хватает смысла вызывать 'Membership.GetUser(). ProviderUserKey'. Вы получаете идентификатор пользователя, но 'Memberhip.GetUser()' ** выполняет ** 'aspnet_Membership_GetUserByName' - запускает его через SQL Server Profiler для подтверждения. Тем не менее, не надо было проверять, что такое кеширование ASP.NET. – kuujinbo

+0

Я не уверен, что получаю вашу мысль. Да, 'Membership.GetUser()' возвращает всю запись пользователя - то, что я изначально хотел увидеть, могу ли я избежать. Но, глядя на сложность кода, который вы опубликовали, я просто не вижу, что все будет намного быстрее. Поэтому я не уверен, что действительно вижу большое преимущество. Извините, я пропустил вашу мысль о 'ntext'. Почему это будет проблемой? (Я использую последнюю версию обо всем.) –

2

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

User.Identity.GetUserId(); 

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

User.Identity.Name; 

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

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

Пожалуйста, обратитесь к сообщению: How to get current user, and how to use User class in MVC5?