0

我设置了一个 MVC4 Web 应用程序,它使用 Forms 身份验证和 Web API 进行交互。所有 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吗?

我还在我的 Principal 中存储了一些自定义数据,这可能是不依赖 RoleProvider 的一个原因(因为我最终会得到一个 RolePrincipal),尽管我可以将其存储在请求上下文中。


更新:我现在添加了一个与和设置DelegatingHandler相同的。这是一个合理的方法吗?IHttpModuleThread.CurrentPrincipal

4

1 回答 1

1

您是否也尝试在 HttpModule 中设置 Thread.CurrentPrincipal ?您还可以使用 Katana 处理程序,它适用于 ASP.NET MVC 和 ASP.NET Web API。

于 2013-08-23T17:55:01.493 回答