Как я могу получить доступ к UserId в ASP.NET Membership без использования Membership.GetUser ()? - PullRequest
17 голосов
/ 29 сентября 2008

Как получить доступ к UserId в членстве ASP.NET без использования Membership.GetUser(username) в проекте веб-приложений ASP.NET?

Можно ли включить UserId в пространство имен Profile рядом с UserName (System.Web.Profile.ProfileBase)?

Ответы [ 10 ]

23 голосов
/ 06 января 2009

Попробуйте это:

MembershipUser CurrentUser = Membership.GetUser(User.Identity.Name);
Response.Write("CurrentUser ID :: " + CurrentUser.ProviderUserKey);
13 голосов
/ 29 сентября 2008

Является ли ваша причина для сохранения вызова базы данных каждый раз, когда вам нужен идентификатор пользователя? Если это так, когда я использую ASP.NET MembershipProvider, я обычно делаю либо собственного провайдера, который позволяет мне кэшировать этот вызов, либо вспомогательный метод, который я могу кэшировать.

Если вы думаете о том, чтобы поместить его в профиль, я не вижу особой причины для этого, тем более что для этого также потребуется вызов базы данных, и, если вы не используете там собственного провайдера профиля, у него есть добавлена ​​обработка разбора UserId.

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

EDIT:

См. статью ScottGu о провайдерах , в которой содержится ссылка на загрузку фактического исходного кода, т. Е. SqlMembershipProvider .

Но самое простое, что можно сделать на самом деле, - это метод GetUserId () в вашем пользовательском объекте или служебный класс, где вы получаете UserId из кэша / сеанса, если он есть, в противном случае попадаете в базу данных, кэшируете его по имени пользователя (или сохраняете в сеанс) и верните его.

Для более подробного рассмотрения (но будьте очень осторожны из-за ограничений размера файлов cookie): Проверка подлинности форм: членство, роли и профиль без провайдеров и без сеанса

4 голосов
/ 02 октября 2008

Я решил написать аутентификацию пользователей пользователей самостоятельно (очень просто, но это работает), и я должен был сделать это давным-давно.

Мой оригинальный вопрос был о UserId, и он недоступен с:

System.Web.HttpContext.Current.User.Identity.Name
2 голосов
/ 16 апреля 2013

Попробуйте следующее:

Membership.GetUser().ProviderUserKey
1 голос
/ 22 ноября 2014
public string GetUserID()
            {
                MembershipUser _User;
                string _UserId = "";
                _User = Membership.GetUser();
                Guid UserId = (Guid)_User.ProviderUserKey;
                return _UserId = UserId.ToString();
            }
0 голосов
/ 13 июля 2011

У меня была эта проблема, решение находится в конфигурации 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>
0 голосов
/ 07 декабря 2008
{
MembershipUser m = Membership.GetUser();
Response.Write("ID: " + m.ProviderUserKey.ToString());
}

Даст вам UserID (uniqueidentifier) ​​для текущего пользователя из таблицы aspnet_Membership - при условии, что текущий успешно вошел в систему. Если вы попытаетесь <% =%> или присвоить это значение до успешной аутентификации, вы получите ошибку "В экземпляре объекта не задана ссылка на объект".

http://www.tek -tips.com / viewthread.cfm? QID = 1169200 & страница = 1

0 голосов
/ 30 сентября 2008

Вы пробовали использовать System.Web.HttpContext.Current.User.Identity.Name? (Убедитесь, что User и Identity не равны нулю.)

0 голосов
/ 30 сентября 2008

Эндрю: Я бы позаботился о выполнении запроса, подобного тому, который вы показали по умолчанию, нет индекса, соответствующего этому, поэтому вы рискуете выполнить полное сканирование таблицы. Более того, если вы используете базу данных пользователей для более чем одного приложения, вы не включили идентификатор приложения.

Ближайшим индексом является aspnet_Users_Index, для которого требуется ApplicationId и LoweredUserName.

EDIT:

Упс - перечитайте пост Эндрю, и он не делает select * в таблице aspnet_Users, а использует пользовательский профиль / таблицу пользователей, используя имя пользователя в качестве первичного ключа.

0 голосов
/ 29 сентября 2008

У вас есть два варианта:

1) Используйте имя пользователя в качестве первичного ключа для вашей таблицы данных пользователя. то есть:

select * from [dbo.User] where Username = 'andrew.myhre'

2) Добавить идентификатор пользователя в профиль.

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

...