0

こんにちは、みんな

ASP.NET Identity 2.0 を使用しているプロジェクトがあります。このプロジェクトでは、Onion アーキテクチャに従っています。レイヤーは次のとおりです。

1.UI: Owin または ASP.Net Identity への参照なし

2.AuthenticationService: asp.net ID usermanager のラッパーが含まれています。このラッパーは、Bal レイヤーに存在するインターフェイスを実装します。このレイヤーには、カスタム UserStore も含まれています。

3.Dal: DbContext はここに存在します。

4.Bal: Domaine エンティティとインターフェイスを含みます。Owin や ASP.NET ID などへの参照はありません。

5.DependencyResolver: Owin Startup に加えて、いくつかの Ninject モジュールと NinjectWebCommon.So am Using Ninject.

今まではすべて順調です。ユーザーはアカウントの作成に満足しており、いつでもログイン/ログアウト/管理できます。現在直面している問題は、Authorize(Role="rolename") にあります。機能しません。

[Authorize(Users="pedro")]
[Authorize]

この作品はどちらも

[Authorize(Roles="Admin")]

これは1つです。

私のデータベースには、ロール管理者に属するユーザーがいます。なぜこれが機能しないのかわかりません.mybeは、すべての認証を別のレイヤーに移動したため、IPrincipal.IsInRole(文字列ロール)が方法を理解できないためですもうこれを確認します。

カスタム Authorize 属性の作成に取り組んでいるか、いくつかの拡張機能を作成しています。しかし、私は最初にあなたのアドバイスを求めることにしました.

お時間をいただきありがとうございます

4

1 に答える 1

1

ここで私は自分の質問に答えています。

実際、問題はメソッド User.IsInRole (または User が IPrincipal であるため IPrincipal.IsInRole) が原因でした。Reflector を使用して AuthorizeAttribute のコードを調べると、この属性が IsInRole メソッドを使用して、認証されたユーザーが役割 X または Xs にあるかどうかを確認することが示されています。ユーザーが特定の役割に属しているかどうか。

問題は、ユーザー用に生成された Cookie から発生します。役割は、そこにある必要がある Cookie に関連付けられているため、IsInRole はそれらを見つけることができます。これが私の間違いです。認証と承認を別の場所に移動しましたが、移動しませんでした。 t は、役割情報を Cookie 内に埋め込む方法を提供するので、(ユーザーまたは役割からの) IsInRole は、Authorize 属性がその仕事を希望どおりに行うためにそれらを見つけることができませんでした。何らかの形でロールを Cookie 内に挿入するだけで済みます。

より良いニュースは次のとおりです。現在使用しているASP.NET Identityはクレームをサポートし、4.5ではGenericPrincipalはClaimsPrincipalから派生し、IPrincipalから派生するため、古いファッションのロールではなくクレームを操作できます(必要に応じて引き続き使用できます)に)。

誰かが同じ問題に遭遇した場合は、次のことをお勧めします。

1.承認属性には、依存しようとしているすべての情報 (役割、ユーザー名) を含む Cookie が必要です。

2. Authorize または ClaimsPrincipalPermission 属性ではなく thinktecture Nuget を使用すると、両方の長所が得られます。

3.クレームについて学ぶ.yoは決して後悔しません.

于 2014-11-19T05:46:02.610 に答える