Question

J'ai un service WCF qui a une classe héritant System.Web.Security.RoleProvider. Dans cette classe, j'utilise le Gestionnaire d'autorisations (AzMan) - en utilisant Azroles.dll -. Pour la gestion des rôles

L'authentification est dans une instance ADAM.

J'ai eu des problèmes avec mon service en charge et il me semblait que je dois changer le service afin que le magasin AzMan a été ouvert et fermé pour chaque appel - sinon les objets ne sont pas libérés et, finalement, la piscine de l'application plantait - au moins c'est ce qui semble être en cours -. Je suis incapable de confirmer à 100%

Dans le code original du magasin AzMan a été initialisé dans la méthode surchargée Initialiser comme ceci:

public class AzManProvider : RoleProvider {
.
.
.
    public override void Initialize( string name, System.Collections.Specialized.NameValueCollection config ) {
                base.Initialize( name, config );
                if ( config != null ) {
                    string appName = null;
                    string connStr = null;
                    foreach ( string k in config.Keys ) {
                        string key = k.ToLower().Trim();
                        string value = config[k];
                        if ( key == "applicationName".ToLower() ) {
                            appName = value;
                        } else if ( key == "connectionStringName".ToLower() ) {
                            connStr = ConfigurationManager.ConnectionStrings[value].ConnectionString;
                        }
                    }
                    if ( connStr.IsEmpty() )
                        throw new ArgumentNullException( "connectionStringName" );
                    CurrentApplicationName = appName;
                    m_azManStore = new AzAuthorizationStoreClass();
                    try {
                        m_azManStore.Initialize( 0, connStr, null );
                    } catch ( Exception ex ) {
                        throw ex;
                    }
                }
            }
.
.
.
}

Je ne sais pas quand cette méthode est appelée exactement. Si vous exécutez dans VS et mettre un point de rupture, il ne sera jamais frappé. Cette classe est instancié en définissant une référence dans le web.config dans la section.

Après avoir fait beaucoup de recherches, je suis tombé sur cette billet de blog qui a suggéré un moyen d'envelopper le magasin AzMan dans une classe à usage unique - assez facile. J'ai créé une classe qui implémente IDisposable:

public class AzManHelper : IDisposable
    {
        public IAzAuthorizationStore Store { get; private set; }
        public IAzApplication Application { get; private set; }

        public AzManHelper(string appName)
        {
            string connStr = ConfigurationManager.ConnectionStrings["AzMan"].ConnectionString;

            try
            {
                    this.Store = new AzAuthorizationStoreClass();
                    this.Store.Initialize(0, connStr, null);   //<-- Exception occurs here
                    this.Store.UpdateCache(null);
                    if (!String.IsNullOrEmpty(appName))
                        this.Application = this.Store.OpenApplication(appName, null);
            }
            catch (COMException cex)
            {
                HandleCOMException(cex);
            }
        }

        public void Dispose()
        {
            if (this.Application == null) 
                return;

            Marshal.FinalReleaseComObject(this.Application);

            if(this.Store != null)
                Marshal.FinalReleaseComObject(this.Store);

            this.Application = null;
            this.Store = null;
        }
}

Maintenant, quand je lance ce code, je reçois un FileNotFoundException lorsque la méthode Initialize sur le magasin AzMan est appelé. Je confirme que la chaîne de connexion est correcte.

Ce qui est particulièrement frustrant est que ce code ne fonctionnera que si je le lance localement dans VS 2010, mais si je le déployer et l'exécuter en tant que service WCF je reçois l'erreur je l'ai mentionné eventhough l'ID utilisateur et LDAP chaîne de connexion sont les mêmes.

Je lis ce blog et affiché l'article

J'ai alors pensé que peut-être la méthode d'initialisation est exécuté en tant que quel que soit le IIS App piscine est en cours d'exécution au fur et à l'extérieur de code qui est exécuté en tant qu'utilisateur imperonated. Ainsi, en utilisant une classe spéciale qui a écrit collegue, j'éteint l'usurpation d'identité lorsque vous appelez la méthode intialize AzMan. Je confirme que l'utilisateur était NETWORK SERVICE mais je reçois toujours la même FileNotFoundException. Je travaille avec les gars sur pour essayer différents paramètres d'autorisation mais jusqu'à présent, pas de chance.

Est-ce que quelqu'un a une idée de pourquoi je reçois cette erreur? Quelles sont les autorisations dois-je regarder?

Peut-être que mon approche à l'utilisation AzMan est erroné - (? À part le fait que je me sers AzMan) est mon architecture erronée

Était-ce utile?

La solution

Je me suis dit à mon problème. Mon service WCF est hébergé dans IIS. Le fichier web.config avait une étiquette en elle. L'usurpation d'identité est un compte de service que le service devait fonctionner comme. Lorsqu'un service WCF est hébergé dans IIS ASP.NET est utilisé pour lancer le service, mais c'est tout. Alors, quand l'application a commencé la classe AzManProvider a été initialisé par ASP de sorte que le usurpation d'identité a été fait. La méthode Initialize est appelée au moment où la classe est instanciée. Le compte servcice a droit à AzMan ouvert. Les appels vers le service WCF ne pas utiliser l'un des paramètres de condifuration ASP dans web.config. Ainsi, les appels de service exécuté sous l'identité du pool d'applications - RÉSEAU DE SERVICE. Pour résoudre ce problème, nous avons changé l'identité du pool d'applications pour fonctionner comme le compte de service - et retiré l'étiquette du web.config. Maintenant, tout fonctionne.

Je ne comprends pas pourquoi ne pas avoir des autorisations de sécurité jetterait une exception FileNotFound.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top