2009-11-13 61 views
2

我有一個自定義角色提供程序,它從數據庫中獲取用戶所屬的角色。我還在我的web.config的httpModules中註冊了自定義身份驗證模塊,該模塊嗅探傳入的HTTP請求,並且(如果它是OAuth簽名的請求)將HttpContext.Current.User屬性設置爲模擬用戶,並且它設置的IPrincipal包括所有用戶的角色,再加上一個名爲「委託」的額外的角色。如何讓RoleProvider避免重寫自定義角色?

問題是,在設置我的自定義IPrincipal後,顯然ASP.NET仍然調用我的自定義角色提供程序,然後將IPrincipal重置爲僅具有該用戶的標準角色的IPrincipal。

如果我在我的web.config文件中設置了<roleManager enabled="false" ...>,則認證模塊的分配角色將保持不變。很顯然,我想要兩全其美。我如何使用角色提供者,但是當我的認證模塊決定要「取消」角色提供者的效果?

回答

1

事實證明,在認證HTTP模塊的初始化方法,我可以找到RoleManager,並鉤住,讓我否決權它是否做它的工作壓倒一切的事件:

public void Init(HttpApplication context) { 
     var roleManager = (RoleManagerModule)context.Modules["RoleManager"]; 
     roleManager.GetRoles += this.roleManager_GetRoles; 
    } 

    private void roleManager_GetRoles(object sender, RoleManagerEventArgs e) { 
     if (this.application.User is OAuthPrincipal) { 
      e.RolesPopulated = true; // allows roles set in AuthenticationRequest to stick. 
     } 
    } 

    private void context_AuthenticateRequest(object sender, EventArgs e) { 
     if (/*oauth request*/) { 
      HttpContext.Current.User = CreateOAuthPrincipal(); 
     } 
    }