我有一个通过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服务工作但是如何通过这个错误?
或许我走错了路,有更好的方法去做我想做的事情?
答案 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>