私はMVC3で簡単なことをやろうとしています。
フォーム認証を使用してサードパーティのSSOでユーザーを認証するアプリケーションがあります。SSOは、ログインに成功すると、アプリケーションの特定のコントローラーアクションにポストバックします。次に、を呼び出しますFormsAuthentication.SetAuthCookie(user,false);
。
あるレベルの認証を実装しようとしています。Admin
簡単に言うと、ユーザーは、やなど、さまざまな役割で存在できますDeveloper
。一部のコントローラーアクションは、特定の役割でのみ使用可能である必要があります。ユーザーが属するロールの詳細は、別の外部APIを呼び出すことで取得されます。これにより、単純なJSON応答が返されます。
理論的には、これは、FormsAuthenticationCookieを設定した後に次のようなことを行うのと同じくらい簡単なはずです。
string[] rolelist = GetRoleListForUserFromAPI(User.Identity.Name);
HttpContext.User = new GenericPrincipal(User.Identity, rolelist);
ただし、現時点では意味がないSetAuthCookie
ため、を呼び出した直後にこれを呼び出すことはできません。HttpContext.User
すべてのリクエストでこれを設定してみることができますが、アプリへのリクエストはラウンドトリップAPI呼び出しを意味します。
これまで見てきた中で最も有望なアプローチは、カスタムのAuthorization属性を作成し、オーバーライドOnAuthorization
して次のようなことを行うことです。
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (<some way of checking if roles have already been set for this user, or role cache has timed out>)
{
string[] rolelist = GetRoleListForUserFromAPI(filterContext.HttpContext.User.Identity.Name);
filterContext.HttpContext.User = new GenericPrincipal(filterContext.HttpContext.User.Identity,rolelist);
}
}
次に、コントローラーアクションの前で使用[MyCustomAuthorization(Roles="Admin")]
して、魔法を起こさせることができます。
HttpContext.User
ただし、現在のオブジェクトにロールが設定されているかどうか、または特定の時間前に設定されており、別のAPIトリップが必要かどうかを検出する方法がわかりません。
このための最良のアプローチは何ですか?