Получить UserID из события входа в систему ASP.Net LoggedIn

В ASP.Net я пытаюсь получить UserId (т. е. GUID пользователя) пользователя, который только что вошел в систему, в событии LoggedIn элемента управления Login. То есть я хочу получить UserId до того, как пользователь перейдет на следующую страницу. Это код, который я использую:

Protected Sub Login1_LoggedIn(ByVal sender As Object, _
  ByVal e As System.EventArgs) Handles Login1.LoggedIn

    Dim UserId As String
    UserId = Membership.GetUser.ProviderUserKey.ToString()

End Sub

Однако я получаю сообщение об ошибке «Ссылка на объект не указывает на экземпляр объекта». Этот же код хорошо работает, когда я использую его на последующих страницах, когда пользователь, вошедший в систему, получает доступ к этим страницам.


person Proposition Joe    schedule 21.10.2009    source источник
comment
Разве это не должно быть Membership.GetUser().ProviderUserKey.ToString()?   -  person pmarflee    schedule 21.10.2009
comment
@pmarflee - это VB.NET. () после GetUser не является обязательным. (Как и () после ToString)!   -  person CraigTP    schedule 21.10.2009


Ответы (1)


У ScottGu есть решение этой проблемы, как описано на эту запись в блоге на форуме ASP.NET:

Событие LoggedIn срабатывает сразу после того, как пользователь вошел в систему с помощью элемента управления входом, но не перед следующим запросом на сайт. Таким образом, объект User еще не заполнен.

Если вы измените свой код на что-то вроде:

Dim UserId As String
UserID = Membership.GetUser(Login1.UserName).ProviderUserKey.ToString()

Он должен работать нормально. Вызов Membership.GetUser без передачи имени пользователя в качестве параметра предполагает захват "текущего" вошедшего в систему пользователя. Конечно, это не удается по указанным выше причинам, поскольку объект User еще не заполнен. Передавая свойство UserName элемента управления Login в качестве параметра методу GetUser(), вы явно заставляете метод Membership.GetUser извлекать пользователя, как указано по имени, из хранилища пользователей (т. е. из базы данных). Это гарантирует, что метод Membership.GetUser возвращает допустимый объект MembershipUser, который позволяет вам получить доступ к свойству ProviderUserKey.

person CraigTP    schedule 21.10.2009
comment
@PropositionJoe: если этот ответ был решением вашей проблемы, вы должны пометить его как принятый! Спасибо! - person Sk8erPeter; 07.05.2012