2010-05-17 60 views
3

我有一個通過wcf服務訪問數據庫的web應用程序。這個想法是使用wcf服務從Web應用程序中提取數據。所有這些工作正常,但我也使用內置的角色提供程序使用SqlRoleManager,它直接訪問aspnetdb數據庫。我想通過在wcf服務中創建一個自定義角色提供程序,然後通過wcf服務訪問它來抽象角色提供程序。我可以通過WCF服務創建自定義角色提供者嗎?

我已經創建了自定義角色提供程序,它工作正常,但現在我需要將它放在wcf服務中。

因此,在我試圖通過WCF服務試圖獲得此功能之前,我在訪問roleprovider類的web應用程序中創建了第二個類,並更改了我的web配置roleprovider參數以使用該類。所以我roleprovider類被稱爲 「UcfCstRoleProvider」 和我的web.config看起來像這樣:

<roleManager 
    enabled="true" 
    defaultProvider="UcfCstRoleProvider"> 
    <providers> 
    <add 
     name="UcfCstRoleProvider" 
     type="Ucf.Security.Wcf.WebTests.UcfCstRoleProvider, Ucf.Security.Wcf.WebTests" 
     connectionStringName="SqlRoleManagerConnection" 
     applicationName="SMTP" /> 
    </providers> 
</roleManager> 

我班開始是這樣的:

public class UcfCstRoleProvider : RoleProvider 
{ 
    private readonly WindowsTokenRoleProvider _roleProxy = new WindowsTokenRoleProvider(); 

    public override string ApplicationName 
    { 
     get 
     { 
      return _roleProxy.ApplicationName; 
     } 
     set 
     { 
      _roleProxy.ApplicationName = value; 
     } 
    } 

正如我所說的,這工作正常。所以第二個類被稱爲BlRoleProvider,它與roleprovide具有相同的屬性和參數,但不實現RoleProvider。我改變web.config中指向此類像這樣:

<roleManager 
    enabled="true" 
    defaultProvider="BlRoleProvider"> 
    <providers> 
    <add 
     name="UcfCstRoleProvider" 
     type="Ucf.Security.Wcf.WebTests.BlRoleProvider, Ucf.Security.Wcf.WebTests" 
     connectionStringName="SqlRoleManagerConnection" 
     applicationName="SMTP" /> 
    </providers> 
</roleManager> 

但我得到這個錯誤。 「提供者必須實現類」System.Web.Security.RoleProvider「。」

我希望我已經解釋得很清楚,以顯示我正在嘗試做什麼。如果我可以讓角色提供者通過同一個應用程序中的另一個類來工作,我相信它可以通過WCF服務工作,但是如何才能通過此錯誤?

或者我轉錯了方向,有更好的方法去做我想做的事?

回答

4

我認爲你最好的選擇是創建一個自定義角色提供者並實現每個方法。在每個方法的實現中,調用WCF服務來執行數據訪問。例如:

public class WcfRoleProvider: RoleProvider 
{ 
    public bool IsUserInRole(string username, roleName) 
    { 
     bool result = false; 
     using(WcfRoleService roleService = new WcfRoleService()) 
     { 
      result = roleService.IsUserInRole(username, roleName); 
     } 

     return result; 
    } 
} 
0

不,你必須有一個必須實現RoleProvider的類。這是行不通的。如果你不能讓這個類直接從RoleProvider繼承,可以考慮創建一個RoleProvider包裝類,它實現RoleProvider的道具/方法,但是利用你需要做的任何事情來處理這個第二類。

此錯誤不是特定於WCF,而是特定於角色提供程序框架。

HTH。

0

看着你的代碼,看起來你已經有了使用自定義角色提供者的配置。

如果您希望能夠通過Web服務來驗證用戶的身份,則應該實現一個自定義標頭,用於根據您配置的角色提供程序對每個請求進行身份驗證。

事情在WCF中的工作方式稍有不同,它不像你有權訪問會話和應用程序狀態,因爲每個調用都被認爲是無狀態的,然而自定義標頭會在調用時處理這些東西來抵消這種情況。

相關問題