我设置了一个 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