16

認証されたユーザーに追加情報を保存して、名前だけでなく、簡単にアクセスできるようにします(たとえば、User.Identity.Idなど)。これは、一意ではないものにすることを計画しているためです。

これまでのところ、カスタムのプリンシパルやIDの実装を検討する必要があることを確認しましたが、その方法がわかりません。私はこの問題に関するドキュメントとチュートリアルを探していましたが、さまざまな場所で関連するものを見つけ、少し混乱していることがわかりました。

ユーザーデータプロパティの認証Cookieにカスタム情報を追加する方法を見てきましたが、単体テストの依存性注入の利点を利用したいと思います。これは、プリンシパルとIDで行うことができます。

自分のプリンシパルまたはIDを実装する場合に考慮する必要がある正確な手順は何ですか?

このシナリオで私ができる最も簡単なことは何でしょうか(IDを追加し、すべてのデフォルトをそのままにしておくだけです)。「デフォルト」には、デフォルトのプロバイダー(メンバーシップ、ロールなど)が含まれます。

他の質問も見ましたが、例のAuthenticateRequestイベントのロールマジックストリングなど、間に穴を残さない回答をいただければ幸いです。代わりに、デフォルトのSqlRoleProviderから現在のユーザーにロールを追加する方法を知る必要があります。いつどこでそれを行うか、そして新しいクラスを他のデフォルトプロバイダーに接続するために何か他のことをする必要があるかどうか。

サンプルのASP.NETMVC2アプリケーション(たとえば、Visual Studio 2010テンプレートから)にアクセスして編集を行い、それを機能させることができれば素晴らしいと思います。


編集:私はここでほとんど迷子になっていることをよりよく示すために質問を編集したので、高レベルの回答でやり遂げることはできません。

PS:ある意味、前に述べたように、プリンシパルではなくIDにIDを含める方が理にかなっているように思われます。

4

2 に答える 2

20

この質問は以前に尋ねられ、回答されています: ASP.NET MVC - カスタム IIdentity または IPrincipal を設定する

しかし、要約すると...

保存する追加のプロパティを使用して、カスタム プリンシパル クラスを作成します。

Public Class CustomPrincipal
    Inherits System.Security.Principal.GenericPrincipal

    Private _eyeColor As String
    Public ReadOnly Property EyeColor As String
        Get
            Return _eyeColor
        End Get
    End Property

    Public Sub New(id As System.Security.Principal.IIdentity, roles As String(), eyeColor As String)
        MyBase.New(id, roles)
        _eyeColor = eyeColor            
    End Sub

End Class

カスタム プリンシパルを使用するように global.asax Global.Application_AuthenticateRequest を変更します。

Protected Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As System.EventArgs)
    ...
    Dim roles() As String = {"examplerole"}         
    Context.User = new CustomPrincipal(Context.User.Identity, roles, "green")
End Sub

これらのプロパティのいずれかを参照する場合は、コードの他の場所で次のようにします。

CType(My.User.CurrentPrincipal, CustomPrincipal).EyeColor
于 2010-07-30T15:52:05.573 に答える
2

誰かが .NET について知らないことをすべて数段落で教えてくれるとは期待できません。MSDN http://msdn.microsoft.com/en-us/library/system.security.principal.genericprincipal.aspxでかなり良い例を読むことができ、クラスを掘り下げることができます。それは Reflector の派生物です - それについて驚くほど特別なことは何もありません.

ロールは、アプリ/サーバーで独自に使用する名前の単なる文字列配列です。

そうは言っても、正確な GenericPrincipal 派生を目指す必要はまったくありません。チェックアウト

HttpContext.Current.Items

これは、サービスを提供しているリクエストのためだけに無料で使用できる Hashtable です。つまり、ある時点で次のように言うことができます。

HttpContext.Current.Items["TokenUser"] = new MyThinUser(anything,I,want,there);

そして、コード内の他のすべてのことは次のとおりです。

var user = HttpContext.Current.Items["TokenUser"] as MyThinUser;

これで完了です。

認証コードから他のすべての機能に必要な/渡したいすべてのものを新しいクラスに保存します。User プロパティはそのまま残します (これにより、何かを変更したことを心配する必要がなくなります)。システムを自由に単純化または複雑化できますが、完全な独立性を維持できます。

たとえば、独自の認証があり、列挙されたロールの代わりにいくつかのレベルのアクセスしかない場合は、古き良きアクセスレベル番号をそのまま使用できます (文字列として持ち運ばれる列挙されたロールは非常に非効率的です)。

VS で自動生成されたサンプルは、通常、特定のシナリオに合わせて調整されていることに注意してください。したがって、実際にそれを使用する必要があるという意味ではないユーザー管理用の SQL プロバイダーが表示された場合でも、SQL の独自のテーブルから必要なものを取得するために独自の sproc を呼び出すことができます。

于 2010-08-03T10:47:08.387 に答える