0

対話にフォーム認証と 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 を追加しました。これは合理的なアプローチですか?IHttpModuleThread.CurrentPrincipal

4

1 に答える 1

1

HttpModule にも Thread.CurrentPrincipal を設定しようとしましたか? ASP.NET MVC と ASP.NET Web API の両方で機能する Katana ハンドラーを使用することもできます。

于 2013-08-23T17:55:01.493 に答える