Как я могу получить доступ к ID пользователя в членство ASP.NET без использования членства.Функций getUser()?


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

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

10 17

10 ответов:

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

MembershipUser CurrentUser = Membership.GetUser(User.Identity.Name);
Response.Write("CurrentUser ID :: " + CurrentUser.ProviderUserKey);

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

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

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

Правка:

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

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

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

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

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

System.Web.HttpContext.Current.User.Identity.Name

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

Membership.GetUser().ProviderUserKey
public string GetUserID()
            {
                MembershipUser _User;
                string _UserId = "";
                _User = Membership.GetUser();
                Guid UserId = (Guid)_User.ProviderUserKey;
                return _UserId = UserId.ToString();
            }

Здесь у вас есть два варианта:

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

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

2) Добавьте UserID в профиль.

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

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

Ближайший индекс-aspnet_Users_Index, который требует ApplicationId и LoweredUserName.

Правка:

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

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

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

Http://www.tek-tips.com/viewthread.cfm?qid=1169200&page=1

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