対話にフォーム認証と Web API を使用する MVC4 Web アプリケーションをセットアップしました。すべての API コントローラーがこの[Authorize]
属性を使用します。
役割のサポートを追加し始めるまで、これは箱から出して問題なく機能していました。本格的な RoleProvider を実装する代わりに、ロールのリストをチケットの に追加しUserData
、次のモジュールを作成しました。
public class SecurityModule : IHttpModule
{
public void Init(HttpApplication context)
{
var roleManager = (RoleManagerModule)context.Modules["RoleManager"];
roleManager.GetRoles += GetRoles;
}
void GetRoles(object sender, RoleManagerEventArgs e)
{
var user = e.Context.User;
if (user.Identity.IsAuthenticated && !(user is MyCustomPrincipal))
{
var roles = GetRolesFromFormsAuthCookie();
if (roles != null)
e.Context.User = new MyCustomPrincipal(user.Identity, roles,
otherData);
}
e.RolesPopulated = true;
}
}
これは、MVC 呼び出しに対して問題なく機能します。ただし、API の場合GetRoles
は を呼び出しても、対応するメソッドに到達すると に戻りGenericPrincipal
ます。
これをWeb APIでも機能させるにはどうすればよいですか? を作成する必要がありDelegatingHandler
ますか?
また、プリンシパルにいくつかのカスタム データを保存しています。これは、RoleProvider だけに依存しない理由かもしれません (RolePrincipal になってしまうため)。ただし、それをリクエスト コンテキストに保存することもできます。
更新:と sets とDelegatingHandler
同じことを行うa を追加しました。これは合理的なアプローチですか?IHttpModule
Thread.CurrentPrincipal