我可以通过WCF服务创建自定义角色提供者吗?

时间:2010-05-17 15:26:54

标签: c# .net asp.net wcf web-services

我有一个通过wcf服务访问数据库的Web应用程序。我们的想法是使用wcf服务从Web应用程序中抽象数据。一切正常但我也使用内置的角色提供者使用SqlRoleManager直接访问aspnetdb数据库。我想通过在wcf服务中创建自定义roleprovider然后通过wcf服务访问它来抽象roleprovider。

我已经创建了自定义角色提供程序,它工作正常,但现在我需要将它放在wcf服务中。

因此,在我开始尝试通过WCF服务实现此功能之前,我在Web应用程序中创建了第二个类,该类访问了roleprovider类并更改了我的web config 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'。”

我希望我已经解释得很好,以显示我想要做的事情。如果我可以让roleprovider在同一个应用程序中通过另一个类工作,我相信它可以通过WCF服务工作但是如何通过这个错误?

或许我走错了路,有更好的方法去做我想做的事情?

3 个答案:

答案 0 :(得分: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;
     }
}

答案 1 :(得分:0)

不,您必须拥有一个必须实现RoleProvider的类。那样不行。如果您不能直接从RoleProvider继承此类,请考虑创建一个RoleProvider包装类,该类实现RoleProvider的props /方法,但是利用您对第二个类所需要做的任何事情。

此错误并非特定于WCF,而是特定于角色提供程序框架。

HTH。

答案 2 :(得分:0)

查看您的代码,您似乎已经使用自定义角色提供程序进行了配置。

如果您希望能够通过Web服务对用户进行身份验证进行身份验证,则应实现一个自定义标头,根据您配置的角色提供程序对每个请求进行身份验证。

在WCF中,事情的工作方式略有不同,它不像你有权访问会话和应用程序状态,因为每个调用被认为是无状态调用,但是自定义标头会通过处理这些内容来抵消调用。< / p>