Расширить System.Web.HttpContext.User

Я хотел бы расширить объект System.Web.HttpContext.User (ASP.NET/VB.NET), чтобы он содержал другие поля, кроме только Name. Я понимаю, что могу создать объект, который наследует класс System.Security.Principal.GenericPrincipal, но как мне сохранить его в объекте Current.User удобным для использования способом. то есть я могу сделать что-то вроде Current.User.UserID,

До сих пор, чтобы достичь этого, я создал хитрый обходной путь, используя | строки с разделителями в свойстве User.Name, а затем их разделение, но это становится немного смешно.

Какие-либо предложения?

Спасибо!

РЕДАКТИРОВАТЬ: я пробовал следующее безрезультатно:

Imports System.Security.Principal
Public Class CurrentUser : Inherits GenericPrincipal
Private _totalpoints As Integer
Private _sentencecount As Integer
Private _probationuntil As DateTime
Public ReadOnly Property TotalPoints() As Integer
    Get
        Return _totalpoints
    End Get
End Property
Public ReadOnly Property SentenceCount() As Integer
    Get
        Return _sentencecount
    End Get
End Property
Public ReadOnly Property ProbationUntil() As DateTime
    Get
        Return _probationuntil
    End Get
End Property
Public Sub New(ByVal principle As IIdentity, ByVal roles() As String, _
ByVal points As Integer, ByVal sentences As Integer, ByVal probationTil As DateTime)
    MyBase.New(principle, roles)
    _totalpoints = points
    _sentencecount = sentences
    _probationuntil = FixDBNull(probationTil)
End Sub
End Class

установка объекта в моем Global.asax Application_AuthenticateRequest функционировать так:

HttpContext.Current.User = New CurrentUser(User, userRoles, _
 points, sentenceCount, probationUntil)

с прямым приведением, где нужен объект, например:

Dim thisUser As CurrentUser = DirectCast(Current.User, CurrentUser)

я также попробовал CType, и он не работал... моя ошибка

[InvalidCastException: невозможно привести объект типа 'System.Security.Principal.GenericPrincipal' к типу 'myProject.CurrentUser'.]

я схожу с ума здесь...:(спасибо, ребята...

кто-нибудь?

2 ответа

Вы можете создать свой собственный класс Principal с необходимыми свойствами, который наследуется от Generic Principal, а затем установить свойство User вашего Current Context как пользователя этого типа.

Пример ниже для ASP.Net MVC, но аналогичный подход может быть использован с веб-формами.

Вы можете сделать это в PostAuthenticateRequest после аутентификации пользователя (в Global.asax).

private void MvcApplication_PostAuthenticateRequest(object sender, EventArgs e)
        {
     SomePrincipal newUser = new SomePrincipal(User.Identity, tmpRoles);

                senderRef.Context.User = newUser;
                System.Threading.Thread.CurrentPrincipal = newUser;
}

Затем вы можете добавить свойство или метод в базовый класс вашей страницы (или контроллера), например, чтобы обернуть и ввести субъект Context.User в свой тип Principal и убедиться, что вы вызываете его, а не вызываете его в HttpContext.

Возможно, есть и другие решения!

Будет ли этот подход работать для вас? Это выглядит немного сложным, но на самом деле это не займет много времени для установки:

  1. Создайте свой "базовый" класс, и ваши страницы будут наследовать от него. Например, создайте базовый класс с именем "BasePage", который наследуется от System.Web.UI.Page.

  2. Ваши страницы ASP.net наследуются от вашего нового класса BasePage.

  3. В классе BasePage вы можете иметь открытое свойство, которое содержит дополнительные поля, которые вы хотите сохранить для вашего пользователя (например, BasePage.FirstName, BasePage.LastName). Более того, создайте объект User, содержащий дополнительные поля, и выставьте его через BasePage, например. "BasePage.Customer". Это поможет сохранить порядок, если вы планируете расширить BasePage позже.

  4. Затем вы можете переопределить OnInit() базового класса, чтобы проверить свойство HTTPContext.Current.User.Name, и получить необходимую информацию из вашей БД для инициализации ваших пользовательских свойств.

Вы можете изменить код так, чтобы он не приходился на базу данных при каждом обновлении страницы, используя ControlState для проверки наличия значений в пользовательских полях, прежде чем снова заполнять их из базы данных.

Надеюсь это поможет...

Ричард.

Другие вопросы по тегам