¿Cómo resuelvo una System.Security.SecurityException con código personalizado en SSRS?

StackOverflow https://stackoverflow.com/questions/32428

Pregunta

Creé un ensamblado y hice referencia a él en mi informe de Reporting Services.Probé el informe localmente (funciona) y luego lo cargué en un servidor de informes (no funciona).

Aquí está el error que arroja el código personalizado que escribí.

System.Security.SecurityException:Solicitud de permiso del tipo 'System.Security.Permissions.SecurityPermission, MSCORLIB, Versión = 2.0.0.0, cultura = Neutral, PublicKeyToken = B77A5C561934E089' Falló.en System.Security.CodeAccessSecurityEngine.checknreturnso (PermissionToken PermToken, CodeAccessPermission Demand, StackCrawlmark & ​​Stackmark, INT32 UnrestlictheverRide, INT32 Create) en System.Security.CodeAccessSECurity OdeAccessPermission.Assert () en [Nombre del método recortado] en ReportExPrHostImpl.CustomCodeproxy. [Nombre del método recortado] La acción que falló fue:Exigir el tipo de permiso que falló fue:System.Security.Permissions.SecurityPermission La zona del ensamblaje que falló fue:Mi computadora

Este proyecto es algo que heredé y no estoy íntimamente familiarizado con él.Aunque tengo el código (ahora), al menos puedo trabajar con él :)

Creo que el código que falla es este:

    Dim fio As System.Security.Permissions.FileIOPermission = New System.Security.Permissions.FileIOPermission(Security.Permissions.PermissionState.Unrestricted)
    fio.Assert()

Sin embargo, este tipo de cosas también están en todas partes:

Private Declare Function CryptHashData Lib "advapi32.dll" (ByVal hhash As Integer, ByVal pbData As String, ByVal dwDataLen As Integer, ByVal dwFlags As Integer) As Integer

Puedo ver que cualquiera de estas son cosas que Reporting Services no aceptaría de inmediato.

¿Fue útil?

Solución 2

Así pude solucionar el problema:

  • firmar firmemente el ensamblaje personalizado en cuestión
  • modifique el archivo rssrvpolicy.config para agregar permisos para el ensamblado

                        <CodeGroup
                            class="UnionCodeGroup"
                            version="1"
                            PermissionSetName="FullTrust"
                            Name="Test"
                            Description="This code group grants the Test code full trust. ">
                            <IMembershipCondition
                                    class="StrongNameMembershipCondition"
                                    version="1"
                                    PublicKeyBlob="0024000004800000940100000602000000240000575341310004000001000100ab4b135615ca6dfd586aa0c5807b3e07fa7a02b3f376c131e0442607de792a346e64710e82c833b42c672680732f16193ba90b2819a77fa22ac6d41559724b9c253358614c270c651fad5afe9a0f8cbd1e5e79f35e0f04cb3e3b020162ac86f633cf0d205263280e3400d1a5b5781bf6bd12f97917dcdde3c8d03ee61ccba2c0"
                                />
                        </CodeGroup>
    

Nota al margen:aquí hay una excelente manera de obtener la clave pública de su ensamblajeTruco VS para obtener el token de clave pública y el blob de un ensamblado firmado.

Otros consejos

<system.web>

<trust level="Full"/>

</system.web>

prueba esto en web.config

Ejecute su servicio en modo administrador

 <CodeGroup class="FirstMatchCodeGroup" version="1" PermissionSetName="FullTrust">

Para mí, la solución fue cambiar la línea anterior en el rssrvpolicy.config de "None" a "FullTrust".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top