none
X509Certificate2UI et IIS RRS feed

  • Discussion générale

  • Bonjour,

    Je réalise actuellement une application web en ASP.NET (C#) qui nécessite la manipulation de certificats X509.

    Afin de faciliter le choix du certificat à l’utilisateur, j’utilise la fonction X509Certificate2UI.SelectFromCollection qui permet d’afficher le magasin de certificats Windows et de renvoyer celui sélectionné par l’utilisateur. Le certificat n'est pas utilisé pour s'authentifier sur le site ; je souhaite uniquement récupérer le certificat choisi par l'utilisateur sous forme d'un objet X509.

    Tout fonctionne correctement quand je teste avec Visual Studio 2010 (en local donc).

    Cependant, quand je déploie le site avec IIS7, j’obtiens l’erreur «The current session is not interactive.». 

    ->Est-il possible de configurer IIS pour qu'il accepte d'utiliser la fonction X509Certificate2UI.SelectFromCollection ?

    D'après mes recherches, la meilleure solution serait de créer un ActiveX . J'ai donc créé un ActiveX qui utilise la fonction X509Certificate2UI.SelectFromCollection, cependant le composant ActiveX est appelé en Javascript et je n'arrive pas à récupérer l'objet X509.

    Page.aspx
    <object name="axDemandeCertX509" style='display: none' id='axDemandeCertX509' classid='CLSID:D100C392-030A-411C-92B6-4DBE9AC7AA5A'>
    </object>
    
    <script language="javascript" type="text/javascript">
         function CallMyMethod() 
        {
            var x = new ActiveXObject("AxControls.DemandeCertX509");
            PageMethods.AjaxSetSession(x.GetCertX509());
        }
        CallMyMethod();
    </script>

    Page.aspx.cs
     
    [WebMethod]
    public static void AjaxSetSession(X509Certificate2Collection value1)
    {
          HttpContext.Current.Session["Certificat"] = value1;
    }

    ->Comment pourrais-je récupérer l'objet X509?

    Merci de l’attention que vous porterez à ma question,

    Cordialement,

    jeudi 23 février 2012 15:22

Toutes les réponses

  • Bonjour,

    Attention, il faut bien comprendre que la page ASP.NET et son code s'exécutent sur le serveur pour produire une page HTML qui sera affichée dans le navigateur. Cela semble marcher pendant votre développement car le client et le serveur sont la même machine. Mais après déploiement cette méthode est lancée sur le serveur ou personne ne peut être là pour répondre ce qui provoque ce message.

    Sinon qu'est ce qui se passe avec votre méthode Ajax ? A mon avis, il y a une erreur mais elle n'est pas traitée. Fournissez en 3 ème argument la fonction appelée en cas d'échec de l'appel.

    Enfin une vue d'ensemble peut parfois aider. Par exemple si ce n'est pas pour l'authentication j'imagine que les utilisateurs pourraient avoir un objectif particulier pour envoyer le certificat et être assez avancés pour leur demander d'uploader un fichier .cer ? Sinon j'aurais au moins essayé ;-)


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".



    jeudi 23 février 2012 17:05
    Modérateur
  • Bonjour et merci pour votre réponse,

    Effectivement avec la première méthode (sans l'ActiveX donc) la fonction est lancée sur le serveur, mais dans cette fonction  je choisi si je souhaite afficher le magasin de certificats de l'utilisateur actuel (le client) ou de la machine locale (le serveur). cf. le première ligne ci-dessous.

    X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser); store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly); X509Certificate2Collection collection = (X509Certificate2Collection)store.Certificates;

    Concernant la méthode Ajax, elle me renvoie simplement "null". J'ai testé en mettant une variable string au lieu d'un objet X509 comme paramètre de retour de la fonction GetCertX509() (cf. post précédant : PageMethods.AjaxSetSession(x.GetCertX509());) et cela fonctionne, j'arrive à afficher la chaîne de caractères.

    vendredi 24 février 2012 11:14
  • Mais la situation reste analogue à un accès au disque c:\. Ce n'est pas parce que vous avez un disque local c:\ que le code exécuté sur le serveur va accéder au même disque. Il accédera au disque c:\ local du serveur. De même X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser); ne va pas accéder au magasin local du client mais au magasin présent sur le serveur pour le compte sous lequel tourne l'application ASP.NET.

    Dans le même ordre idée, le code qui s'exécute sur le serveur n'a aucune connaissance du disque local qui correspond à la clé USB (et heureusement pour des raisons de sécurité). Je ne sais pas exactement ce que vous cherchez à faire, mais pour moi d'une façon ou d'une autre, l'utilisateur devra donner explictement accès à ce certificat, l'une des méthodes les plus simples me semblant être de lui demander d'inidiquer ou se trouve le certificat. Ou peut-être une application ClickOnce mais l'utilisateur devra lui accorder sa confiance ? Ou donc ActiveX comme vous avez commencé à le faire. Ce contrôle fonctionne t'il déjà bien en local ?

    Comme souvent comprendre votre objectif général pourrait permettre éventuellement permettre de donner des suggestions plus précises.

    Par exemple http://www.networking4all.com/fr/support/certificats+ssl/manuels/plesk/tableau+de+contr%C3%B4le+plesk/version+6/installer+le+certificat/ ou http://support.citrix.com/article/CTX111872 fonctionnent tous les deux en téléchargeant un fichier certificat (et ce dernier article explique aux utilisateurs comment l'exporter).


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".


    mardi 10 avril 2012 11:41
    Modérateur