Shibbolethのと承認に対するasp.net MVC認証
-
23-08-2019 - |
質問
ここで私は、現在接続しているユーザーについての情報を得るのですか?それはどのようにShibbolethのは、情報を渡すんです?
私は、Shibbolethのから取得したデータに基づいて、[承認]属性を使用して、アクションにはいくつかの制限を設定することはできますか?
解決
のShibbolethは、関連付けられたユーザー属性を公開します ヘッダ名に基づいて、HTTPリクエストヘッダにセッションは、定義されました 属性での受け入れ方針(1.3.xの)またはマッピング(2.xのを)属性 ファイル。これらのヘッダーはベースのCGI変数に変換されています CGI仕様で定義されたマッピングルールに
あなたは、このセキュリティアドバイザリに注意してください。 http://shibboleth.net/community/advisories/secadv_20090615.txtする
他のヒント
私は決してユーザーのShibbolethを持っていますが、Controller.Userプロパティからユーザーに関する情報を得ることができます。これは、現在のスレッドの汎用的なプリンシパルを返します。このプリンシパルを使用して、あなたは、ユーザーが認証されているかどうかをチェックし、ユーザーのログイン名を取得することができます。これは、後の認証Cookieが設定されているログオンの理由によるものであり、このクッキーは、情報の限られた量が含まれています。 (それが存在し、有効な場合 - ユーザーが認証されている)と、ログオン後の各要求にのみ、このクッキーがチェックされます。
あなたには、いくつかの特定の情報に必要なのであれば、手動でユーザーをロードする(それはここではキャッシュを使用することをお勧めします)、あなたが望むものは何でも確認することができます。
また、あなたは(例えば、要求の開始に、ベースプリンシパルからユーザー名を使用してDB /キャッシュからユーザーを読み込む作成し、スレッドに独自のプリンシパルを設定)リクエストの開始のスレッドに必要な情報を使用して独自のプリンシパルを作成して添付することができます。この後、あなたはあなたが必要とするユーザーのすべてのプロパティを確認することができます。
どこで独自のプリンシパルを添付するのでしょうか?あなたは、要求の開始に言っていますが、すべての要求が許可何をしたくない場合はどうなりますか?
あなたは次のシグネチャがありGlobal.asax.csでメソッドを作成するとよいでしょう。
protected void Application_PostAuthenticateRequest()
{
//Your code here.
}
この前に他のほとんど何が行われ、自動的に呼び出されます(それが存在する場合、MVCはあなたがどこでも「にそれを回す」にする必要はありません、このメソッドを呼び出します)、そしてあなたが校長を設定する必要がある場所です。例えば、ユーザーIDのは、あなたが役割のカンマ区切り値と(当たり前)がRolesHeader
と呼ばれる別のヘッダを持っているUserId
というヘッダーを持っていると仮定しましょう。
あなたのコードは、任意のエラー処理なしで、次のようになります。
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を実装する独自のカスタムクラスを作成したいので、私はそれでより多くのユーザー情報を詰め込むことができます。マイカスタムプリンシパルとアイデンティティオブジェクトは、その後、このような枝番号や電子メールアドレスまたは何としてはるかに豊富な情報を持っています。
そこで、私は、次のいBaseController
と呼ばれるコントローラを作成
protected new CustomPrincipal User
{
get
{
return (base.User as CustomPrincipal) ?? CustomPrincipal.GetUnauthorizedPrincipal();
}
}
これは、私が代わりにIPrincipalで定義されていますだけで何のすべての私の豊富な、カスタムプリンシパル・データにアクセスすることができます。私の本当のコントローラのすべてが、その後BaseController
からではなく直接のController
から継承します。
もちろん、Application_PostAuthenticateRequest()メソッドでは、あなたの代わりにCustomPrincipal
のGenericPrincipal
するContext.Userを設定したい。