【问题标题】:Web API with Forms authentication and roles具有表单身份验证和角色的 Web API
【发布时间】:2013-08-23 12:35:00
【问题描述】:

我设置了一个 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,它的作用与IHttpModule 相同,并设置Thread.CurrentPrincipal。这是一个合理的方法吗?

【问题讨论】:

    标签: asp.net-mvc asp.net-web-api forms-authentication


    【解决方案1】:

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

    【讨论】:

    • Qué boludo que soy :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    • 2019-10-04
    • 1970-01-01
    相关资源
    最近更新 更多