2009-05-21 48 views
0

現在接続されているユーザーに関する情報はどこで入手できますか?つまり、shibbolethはどのように情報を渡しますか?asp.net mvc認証とshibbolethと認証

shibbolethから取得したデータに基づいて[Authorize]属性を使用するアクションにいくつかの制限を設定できますか?

答えて

2

Shibbolethのは、ユーザ属性受領ポリシー(1.3.xの)で 定義ヘッダ名に基づいて、HTTPリクエストヘッダに セッションに関連付けられた属性またはマッピング(2.xの) ファイル属性を公開します。これらのヘッダーは、CGI仕様で定義されたマッピングルールで に基づいてCGI変数に変換されます。 http://shibboleth.net/community/advisories/secadv_20090615.txt

+0

更新されたリンクを提供してください、私は同じ質問をしており、リンクはもう無効です。私はできるだけ早く助けが必要です。お返事ありがとうございます。 – Ruba

+1

@ルバ、あなたがまだそれを探していた場合に備えて、あなたが通知を受けるとは思わないので、私は編集のために編集を提出しました。新しいリンクはhttp://shibboleth.net/community/advisories/secadv_20090615.txtです –

0

ユーザーは一度もありませんが、Controller.Userプロパティからユーザーに関する情報を取得できます。現在のスレッドのジェネリックプリンシパルを返します。このプリンシパルを使用すると、ユーザーが認証されているかどうかを確認し、ユーザーのログイン名を取得できます。これは、ログオン後に認証Cookieが設定され、このCookieには限られた量の情報が含まれているためです。また、ログオン後の各リクエストでは、このクッキーのみがチェックされます(存在し、有効である - ユーザーが認証されている場合)。
特定の情報が必要な場合は、手動でユーザーを読み込むことができます(ここではキャッシュを使用する方がよい)。
また、要求の開始時にスレッドに必要な情報を持つ独自のプリンシパルを作成してアタッチすることもできます(たとえば、要求の開始時に基本プリンシパルからのユーザー名を使用してdb/cacheからユーザーをロードし、糸)。その後、必要なユーザーのすべてのプロパティを確認することができます。

0

は、あなたがあなた自身の校長を添付します:あなたは、このセキュリティアドバイザリに注意する必要があります

?リクエストの開始時にあなたは言うが、すべてのリクエストが許可されないようにする場合はどうすればよいでしょうか?

0

あなたはそれが存在する場合(MVCは、このメソッドを呼び出します次のシグネチャ

protected void Application_PostAuthenticateRequest() 
{ 
    //Your code here. 
} 

これは他のほとんど何が行われる前に自動的に呼び出されますがありGlobal.asax.csでメソッドを作成したいと思いますあなたはどこにいてもそれをオンにする必要はありません)、ここでプリンシパルを設定する必要があります。たとえば、ロールのカンマ区切り値を持つRolesHeaderというヘッダーと、ユーザーIDが(duh)の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を実装する独自のカスタムクラスを作成したいので、私はより多くのユーザー情報を詰め込むことができますその中に。カスタムのプリンシパルオブジェクトとアイデンティティオブジェクトには、ブランチ番号や電子メールアドレスなど、より豊富な情報が含まれています。

はその後、私はこれではなく、IPrincipalで定義されていますだけで何のすべての私の豊富な、カスタムプリンシパル・データにアクセスするために私を可能にする、次の

protected new CustomPrincipal User 
{ 
    get 
    { 
     return (base.User as CustomPrincipal) ?? CustomPrincipal.GetUnauthorizedPrincipal(); 
    } 
} 

を持ってBaseControllerと呼ばれるコントローラを作成します。私の実際のコントローラはすべてControllerから直接ではなくBaseControllerから継承します。

明らかに、このようなカスタムプリンシパルを使用する場合、Application_PostAuthenticateRequest()メソッドでは、GenericPrincipalの代わりにCustomPrincipalにContext.Userを設定します。