3

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

Application_AuthenticateRequest次のように Global.asax 関数でオブジェクトを設定します。

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' にキャストできません。]

私はここで私の心を失っています... :(みんなありがとう...

誰でも?

4

2 に答える 2

3

ジェネリックプリンシパルから継承する必要なプロパティを使用して独自のプリンシパルクラスを作成し、現在のコンテキストのUserプロパティをそのタイプのユーザーに設定できます。

以下の例はASP.NetMVCの場合ですが、同様のアプローチをWebフォームで使用できます。

これは、ユーザーが認証された後(Global.asaxで)PostAuthenticateRequestで実行できます。

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プリンシパルをラップしてプリンシパルタイプに入力し、HttpContextで呼び出すのではなく、必ず呼び出すことができます

おそらく他の解決策もあります!

于 2009-06-05T10:08:03.860 に答える
2

このアプローチはあなたのために働きますか?少し複雑に見えますが、セットアップにそれほど時間はかかりません。

  1. 独自の「ベース」クラスを作成し、ページにそれを継承させます。たとえば、System.Web.UI.Pageから継承する「BasePage」という基本クラスを作成します。

  2. ASP.netページに新しいBasePageクラスを継承させます。

  3. BasePageクラスでは、ユーザー用に保存する追加のフィールド(BasePage.FirstName、BasePage.LastNameなど)を含むパブリックプロパティを設定できます。さらに良いことに、追加のフィールドを含むUserオブジェクトを作成し、BasePageを介して公開します。「BasePage.Customer」。これにより、後でBasePageを拡張する予定がある場合でも、作業が整頓されます。

  4. 次に、基本クラスのOnInit()をオーバーライドしてHTTPContext.Current.User.Nameプロパティを確認し、DBから必要な情報をフェッチしてカスタムプロパティを初期化できます。

ControlStateを使用してカスタムフィールドに値があるかどうかを確認してからデータベースから再度入力することにより、ページが更新されるたびにデータベースにアクセスする必要がないようにコードを変更できます。

お役に立てれば...

リチャード。

于 2009-06-05T10:07:53.627 に答える