En fait, si nous ne configurons pas, mais modifions simplement le code, après avoir exécuté le programme, l'interface d'erreur sera celle illustrée dans la figure 1 ci-dessous :
L'exception sera levée comme suit :
************** Texte d'exception **************
System.MethodAccessException : tentative par la méthode transparente de sécurité ' Rare.Card.Libary.Controls.
ReadCardControl.btnRead_Click(System.Object, System.EventArgs)' d'appeler du code natif via la méthode 'Rare.Card.Libary .MifareOneHelper.rf_read(Int32, Int32, Byte[ ])' a échoué. Les méthodes doivent être critiques en matière de sécurité ou
critiques en matière de sécurité pour appeler le code natif.
Par. en consultant MSDN, l'explication de l'exception est la suivante :
Dans Microsoft .NET Framework 4, le modèle de sécurité Common Language Runtime (CLR) a subi de nombreux changements. L'un des changements, l'adoption de la transparence de niveau 2
(très similaire au modèle de sécurité de Silverlight) est susceptible d'affecter les auteurs de la bibliothèque AllowPartiallyTrustedCallers (APTCA). Il existe trois attributs de transparence : SecurityTransparent, SecuritySafeCritical et SecurityCritical.
SecurityTransparent : le code marqué comme SecurityTransparent est fiable du point de vue de la sécurité. Il ne peut accomplir aucune opération dangereuse, telle que l'affirmation d'autorisations,
l'exécution de code invérifiable ou l'appel de code natif. Il ne peut pas non plus appeler directement le code SecurityCritical.
Comme mentionné ci-dessus, pour des raisons de sécurité, tout code partiellement fiable doit être SecurityTransparent. C'est également la transparence par défaut de la bibliothèque APTCA.
SecurityCritical : contrairement à SecurityTransparent , le code SecurityCritical est capable d'effectuer n'importe quelle opération souhaitée. Il peut effectuer des déclarations, des
appels au code natif et d'autres opérations. Il peut appeler d'autres méthodes sans être limité par l'indicateur de transparence.
Seul un code entièrement fiable peut être SecurityCritical. En fait, le code (non APTCA) entièrement fiable est SecurityCritical par défaut,
le protégeant ainsi des appels d'appelants transparents partiellement fiables.
SecuritySafeCritical : le code SecuritySafeCritical joue le rôle d'un pont, qui permet au code transparent d'appeler des méthodes clés. Le code SecuritySafeCritical
a les mêmes autorisations que le code SecurityCritical, mais il peut être appelé par le code SecurityTransparent. Par conséquent, il est extrêmement important que le code SecuritySafeCritical expose les méthodes SecurityCritical sous-jacentes de manière sécurisée (pour éviter qu'un code malveillant partiellement fiable ne tente d'attaquer ces méthodes via la couche SecuritySafeCritical).
Comme le code SecurityCritical, le code SecuritySafeCritical doit être entièrement fiable.
Selon l'explication de MSDN, le problème réside dans la bibliothèque de classes C# CardReader.Library qui encapsule la DLL d'origine. Nous pouvons définir l'attribut de transparence au niveau du code pour résoudre le problème.
La solution spécifique est la suivante :
1. Définissez l'attribut transparent du code de lecture de la carte de contrôle ActiveX sur : SecuritySafeCritical. La liste de codes après réglage est la suivante :
[SecuritySafeCritical] /// <summary> /// 读卡 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnRead_Click(object sender, EventArgs e) { int i = 0; byte[] data = new byte[16]; byte[] buff = new byte[32]; for (i = 0; i < 16; i++) data[i] = 0; for (i = 0; i < 32; i++) buff[i] = 0; st = MifareOneHelper.rf_read(icdev, sec * 4 + 1, data); if (st == 0) { SerialInterfaceHelper.hex_a(data, buff, 16); txtCardID.Text = System.Text.Encoding.ASCII.GetString(buff); lblMsg.Text = "读取卡号成功!"; } else lblMsg.Text = "读取卡号失败!"; //test method //if (string.IsNullOrEmpty(txtCardID.Text)) //{ // lblMsg.Text = "读取数据失败!"; //} //else //{ // lblMsg.Text = string.Format("读取数据:{0}!", txtCardID.Text); //} }
Le code de test est commenté ici, et le code de communication série et de lecture de la carte est utilisé.
2. Définissez l'attribut transparent qui encapsule la DLL du lecteur de carte d'origine.
Définissez l'attribut transparent de la classe d'assistance du lecteur de carte M1 MifareOneHelper sur : [SecurityCritical], et définissez l'attribut
transparent de la méthode appelée MifareOneHelper.rf_read sur [SecurityCritical].
Définissez l'attribut transparent de la classe d'assistance de communication série SerialInterfaceHelper sur : [SecurityCritical], et définissez l'attribut
transparent de la méthode appelée SerialInterfaceHelper.hex_a sur [SecurityCritical].
Le code complet a été fourni. Il y a deux autres choses à noter. Si le client ne parvient pas à installer ActiveX, l'adresse exécutant ActiveX sera ajoutée au site de confiance.
Le niveau de sécurité du site de confiance. le site est réduit à Réduire ou définir l'option Sites de confiance concernant ActiveX.