Расширить System.Web.HttpContext.User - PullRequest
3 голосов
/ 05 июня 2009

Я хотел бы расширить объект 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 ]

3 голосов
/ 05 июня 2009

Вы можете создать свой собственный класс 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.

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

2 голосов
/ 05 июня 2009

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

  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 для проверки наличия значений в пользовательских полях перед повторным заполнением их из базы данных.

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

Ричард.

...