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

StackOverflow https://stackoverflow.com/questions/146896

Вопрос

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

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

Это было полезно?

Решение 3

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

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

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

Другие советы

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

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

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

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

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

РЕДАКТИРОВАТЬ:

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

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

Еще кое-что, на что следует обратить внимание (но будьте очень осторожны из-за ограничений на размер файлов cookie): Формы аутентификации:Членство, роли и профиль без поставщиков и сеансов

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

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.

РЕДАКТИРОВАТЬ:

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top