2013-08-23 57 views
0

我有一個MVC4 Web應用程序設置,它使用Forms身份驗證和Web API進行交互。所有API控制器都使用[Authorize]屬性。帶有窗體身份驗證和角色的Web API

直到我們開始添加角色支持時,它纔開始工作。相反,實施全面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。這是一個合理的方法嗎?

回答

1

您是否嘗試在HttpModule中設置Thread.CurrentPrincipal?您也可以使用Katana處理程序,它可以用於ASP.NET MVC和ASP.NET Web API。

+0

Québoludo que soy :-) –