Как я могу получить доступ к UserId в членстве ASP.NET без использования Membership.GetUser()?
Как я могу получить доступ к UserId
в членстве ASP.NET без использования Membership.GetUser(username)
в проекте веб-приложения ASP.NET?
Может UserId
быть включенным в пространство имен Profile
рядом с UserName
(System.Web.Profile.ProfileBase
)?
Ответы
Ответ 1
Я решил написать аутентификацию пользователей пользователей самостоятельно (очень просто, но это работает), и я должен был сделать это давным-давно.
Мой первоначальный вопрос касался UserId, и он недоступен из:
System.Web.HttpContext.Current.User.Identity.Name
Ответ 2
Попробуйте следующее:
MembershipUser CurrentUser = Membership.GetUser(User.Identity.Name);
Response.Write("CurrentUser ID :: " + CurrentUser.ProviderUserKey);
Ответ 3
Является ли ваша причина для сохранения вызова базы данных каждый раз, когда вам нужен UserId? Если это так, когда я использую ASP.NET MemberhipProvider, я обычно либо делаю пользовательский поставщик, который позволяет мне кэшировать этот вызов, либо метод полезности, который я могу кэшировать.
Если вы думаете о том, чтобы поместить его в профиль, я не вижу большой причины для этого, тем более, что он также по-прежнему будет требовать вызова базы данных, и если вы не используете собственный поставщик профилей, он имеет добавлена обработка разбора UserId.
Если вам интересно, почему они не реализовали метод GetUserId, это просто потому, что вам не всегда гарантируется, что этот идентификатор пользователя будет GUID, как в включенном поставщике.
EDIT:
См. статью ScottGu о поставщиках, которая предоставляет ссылку для загрузки фактического исходный код для SqlMembershipProvider.
Но самой простой вещью является метод GetUserId() в вашем пользовательском объекте или классе утилиты, где вы получаете UserId из кеша/сессии, если есть, в противном случае попадаете в базу данных, кешируйте его именем пользователя (или сохраняете в сеанс) и вернуть его.
Для чего-то большего рассмотреть (но будьте очень осторожны из-за ограничений размера файлов cookie): Forms Auth: членство, роли и профиль без провайдеров и без сеанса
Ответ 4
Попробуйте следующее:
Membership.GetUser().ProviderUserKey
Ответ 5
public string GetUserID()
{
MembershipUser _User;
string _UserId = "";
_User = Membership.GetUser();
Guid UserId = (Guid)_User.ProviderUserKey;
return _UserId = UserId.ToString();
}
Ответ 6
У вас есть два варианта:
1) Использовать имя пользователя в качестве первичного ключа для таблицы данных пользователя
то есть:
select * from [dbo.User] where Username = 'andrew.myhre'
2) Добавить UserID в профиль.
Для каждого метода есть плюсы и минусы. Лично я предпочитаю первое, потому что это означает, что мне не обязательно устанавливать готового поставщика профилей, и я предпочитаю в любом случае применять уникальные имена пользователей в моих системах.
Ответ 7
Эндрю: Я бы постарался сделать такой запрос, как то, что вы показали по умолчанию, нет индекса, который соответствует этому, поэтому вы рискуете полностью сканировать таблицу. Более того, если вы используете свою базу данных пользователей для нескольких приложений, вы не включили идентификатор приложения.
Ближайшим индексом является aspnet_Users_Index, для которого требуются имя ApplicationId и LoweredUserName.
EDIT:
Упс - перечитайте сообщение Andrew, и он не делает select * в таблице aspnet_Users, а, скорее, пользовательскую таблицу профиля/пользователя, используя имя пользователя в качестве первичного ключа.
Ответ 8
Пробовали ли вы использовать System.Web.HttpContext.Current.User.Identity.Name
? (Убедитесь, что User
и Identity
сначала не нуль.)
Ответ 9
{
MembershipUser m = Membership.GetUser();
Response.Write("ID: " + m.ProviderUserKey.ToString());
}
Дает вам идентификатор пользователя (uniqueidentifier) для текущего пользователя из таблицы aspnet_Membership - если текущий вход успешно зарегистрирован. Если вы попытаетесь <% =% > или назначьте это значение перед успешной аутентификацией, вы получите error "Ссылка на объект не установлена в экземпляр объекта".
http://www.tek-tips.com/viewthread.cfm?qid=1169200&page=1
Ответ 10
У меня была эта проблема, решение находится в конфигурации web.config, попробуйте настроить web.config следующим образом:
<roleManager
enabled="true"
cacheRolesInCookie="true"
defaultProvider="QuickStartRoleManagerSqlProvider"
cookieName=".ASPXROLES"
cookiePath="/"
cookieTimeout="30"
cookieRequireSSL="false"
cookieSlidingExpiration="true"
createPersistentCookie="false"
cookieProtection="All">
<providers>
<add name="QuickStartRoleManagerSqlProvider"
type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="ASPNETDB"
applicationName="SecurityQuickStart"/>
</providers>
</roleManager>