現在接続しているユーザーに関する情報はどこで入手できますか? つまり、shibboleth はどのように情報を渡すのでしょうか?
shibbolethから取得したデータをもとに、[Authorize]属性を使ってアクションを制限することはできますか?
現在接続しているユーザーに関する情報はどこで入手できますか? つまり、shibboleth はどのように情報を渡すのでしょうか?
shibbolethから取得したデータをもとに、[Authorize]属性を使ってアクションを制限することはできますか?
Shibboleth は、属性受け入れポリシー (1.3.x) または属性マッピング (2.x) ファイルで定義されたヘッダー名に基づいて、セッションに関連付けられたユーザー属性を HTTP 要求ヘッダーに発行します。これらのヘッダーは、CGI 仕様で定義されたマッピング規則に基づいて CGI 変数に変換されます。
次のセキュリティ アドバイザリに注意してください: http://shibboleth.net/community/advisories/secadv_20090615.txt
私はユーザーをシボレスにしたことはありませんが、Controller.User プロパティからユーザーに関する情報を取得できます。現在のスレッドの一般的なプリンシパルを返します。このプリンシパルを使用して、ユーザーが認証されているかどうかを確認し、ユーザーのログイン名を取得できます。これは、ログオン後に認証 Cookie が設定され、この Cookie に含まれる情報量が限られているためです。また、ログオン後の各リクエストでは、この Cookie のみがチェックされます (存在し有効な場合、ユーザーは認証されます)。
したがって、特定の情報が必要な場合は、手動でユーザーをロードし (ここではキャッシュを使用することをお勧めします)、必要なものを確認できます。
また、リクエストの開始時に必要な情報を含む独自のプリンシパルを作成してスレッドにアタッチすることもできます (たとえば、リクエストの開始時に、ベース プリンシパルのユーザー名を使用して db/cache からユーザーをロードし、独自のプリンシパルを作成してスレッドに設定します)。 . この後、必要なユーザーのすべてのプロパティを確認できます。
独自のプリンシパルをどこに接続しますか? リクエストの開始時に言いますが、すべてのリクエストを承認したくない場合はどうすればよいでしょうか?
次のシグネチャを持つ Global.asax.cs にメソッドを作成する必要があります。
protected void Application_PostAuthenticateRequest()
{
//Your code here.
}
これは、他のほとんどの処理が行われる前に自動的に呼び出されます (存在する場合、MVC はこのメソッドを呼び出します。どこでも「有効にする」必要はありません)。ここでプリンシパルを設定する必要があります。たとえばRolesHeader
、カンマで区切られた役割の値を持つヘッダーとUserId
、ユーザー ID (当然のこと) を持つ別のヘッダーがあるとします。
エラー処理を行わないコードは、次のようになります。
protected void Application_PostAuthenticateRequest()
{
var rolesheader = Context.Request.Headers["RolesHeader"];
var userId = Context.Request.Headers["UserId"];
var roles = rolesheader.Split(',');
var principal = new GenericPrincipal(new GenericIdentity(userId), roles);
Context.User = principal;
}
属性が使用するのはプリンシパル/アイデンティティである[Authorize]
ため、リクエスト ライフサイクルの最初にここで設定すると、[Authorize]
属性が正しく機能します。
これの残りはオプションですが、私はそれをお勧めします:
GenericPrincipal と GenericIdentity を使用する代わりに、IPrincipal と IIdentity を実装する独自のカスタム クラスを作成して、より多くのユーザー情報を詰め込むことができます。カスタム プリンシパル オブジェクトと ID オブジェクトには、支店番号や電子メール アドレスなど、より豊富な情報が含まれます。
BaseController
次に、次のような Controller を作成します。
protected new CustomPrincipal User
{
get
{
return (base.User as CustomPrincipal) ?? CustomPrincipal.GetUnauthorizedPrincipal();
}
}
これにより、IPrincipal で定義されているものだけでなく、すべての豊富なカスタム プリンシパル データにアクセスできます。私の実際のコントローラーはすべて、からBaseController
直接ではなくから継承しController
ます。
明らかに、このようなカスタム プリンシパルを使用する場合は、Application_PostAuthenticateRequest() メソッドで、 Context.User を のCustomPrincipal
代わりにyour に設定しますGenericPrincipal
。