2010-05-17 58 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中的工作方式稍有不同,它不像你有权访问会话和应用程序状态,因为每个调用都被认为是无状态的,然而自定义标头会在调用时处理这些东西来抵消这种情况。

相关问题