2010-05-17 2 views
3

J'ai une application web qui accède à une base de données via un service wcf. L'idée est d'extraire les données de l'application web en utilisant le service wcf. Tout cela fonctionne bien, mais j'utilise aussi le roleprovider intégré en utilisant le SqlRoleManager qui accède directement à la base de données aspnetdb. Je voudrais abstraire le fournisseur de rôles en créant un fournisseur de rôles personnalisé dans un service wcf et en y accédant via le service wcf.Puis-je créer un fournisseur de rôles personnalisé via un service WCF?

J'ai créé le fournisseur de rôle personnalisé et cela fonctionne bien, mais maintenant je dois le placer dans un service wcf. Avant de sauter la tête pour essayer de faire fonctionner le service WCF, j'ai créé une deuxième classe dans l'application web qui a accédé à la classe roleprovider et modifié mes paramètres de fournisseur de rôle web config pour utiliser cette classe. Donc, ma classe RoleProvider est appelée, "UcfCstRoleProvider" et mon web.config ressemble à ceci:

<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> 

Ma classe commence comme ceci:

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

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

Comme je l'ai dit, cela fonctionne très bien. Ainsi, la seconde classe s'appelle BlRoleProvider qui a des propriétés et des paramètres identiques à ceux du rôleprovide mais n'implémente pas RoleProvider. J'ai changé le web.config pour pointer vers cette classe comme ceci:

<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> 

Mais j'obtiens cette erreur. "Le fournisseur doit implémenter la classe" System.Web.Security.RoleProvider "."

J'espère que j'ai expliqué assez bien pour montrer ce que j'essaie de faire. Si je peux obtenir que le fournisseur de rôle travaille à travers une autre classe dans la même application, je suis sûr que cela fonctionnera à travers le service WCF, mais comment puis-je passer cette erreur?

Ou peut-être que j'ai pris un mauvais virage et qu'il y a une meilleure façon de faire ce que je veux faire?

Répondre

4

Je pense que votre meilleur pari est de créer un fournisseur de rôle personnalisé et implémenter chaque méthode. Dans l'implémentation de chaque méthode, appelez le service WCF pour effectuer l'accès aux données. Par exemple:

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

Non, vous devez avoir une classe qui doit implémenter RoleProvider. Ça ne marchera pas. Si vous ne pouvez pas faire en sorte que cette classe hérite directement de RoleProvider, envisagez de créer une classe wrapper RoleProvider qui implémente les accessoires/méthodes de RoleProvider, mais utilise tout ce dont vous avez besoin avec cette seconde classe.

Cette erreur n'est pas spécifique à WCF, mais spécifique à l'infrastructure de fournisseur de rôle.

HTH.

0

En regardant votre code, il apparaît que vous avez déjà votre configuration en utilisant un fournisseur de rôle personnalisé.

Si vous souhaitez authentifier les utilisateurs effectuant des appels via votre service Web, vous devez implémenter un en-tête personnalisé qui authentifie chaque demande auprès de votre fournisseur de rôle configuré. Les choses fonctionnent un peu différemment dans WCF, ce n'est pas comme si vous aviez accès aux états de session et d'application puisque chaque appel est considéré comme sans état, un en-tête personnalisé compensera cependant cela en manipulant ce truc quand l'appel est fait.

Questions connexes