8

Intento implementar Autenticación y Autorización de ASP.NET sobre nuestra base de datos existente. Tenemos un sitio web que llama a un servicio web para buscar sus datos. Para usar el servicio web, necesito proporcionar el nombre de usuario y la contraseña. Sabiendo eso, decidí implementar IIdentity e IPrincipal para almacenar la contraseña encriptada y poder proporcionarla al realizar llamadas al servicio web. En el futuro, es posible que deseemos utilizar más de la seguridad incorporada de asp.net, así que implemento la membresía y el proveedor de funciones y anulo justo lo que necesito (ValidateUser y GetRoles) Aunque, después de validar al usuario gracias a Implementación del proveedor de membresía Aún estoy configurando mi propia CustomIdentity en Context.User para poder recuperar su contraseña cuando sea necesario.SerializationException en 'CustomIdentity' cuando se deniega el usuario en ASP.NET

Funciona perfectamente siempre que el usuario tenga permiso para visitar la página. pero cuando se deniega al usuario, en lugar de arrojar una excepción AccessDeniedException, el marco arroja una excepción de serialización en mi CustomIdentity. Encontré un perfectly similar behaviour with more details described on this link, pero no se ha publicado ninguna respuesta.

Mi excepción es exactamente el mismo que en el enlace anterior

 

Type is not resolved for member'CW.CustomAuthentication.CWIdentity,CW.CustomAuthentication, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.Runtime.Serialization.SerializationException: Type is not resolved for member 'CW.CustomAuthentication.CWIdentity,CW.CustomAuthentication, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. 

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below. 

Stack Trace: 

[SerializationException: Type is not resolved for member 'CW.CustomAuthentication.CWIdentity,CW.CustomAuthentication, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.] 
    Microsoft.VisualStudio.WebHost.Connection.get_RemoteIP() +0 
    Microsoft.VisualStudio.WebHost.Request.GetRemoteAddress() +65 
    System.Web.HttpRequest.get_UserHostAddress() +18 
    System.Web.HttpRequest.get_IsLocal() +13 
    System.Web.Configuration.CustomErrorsSection.CustomErrorsEnabled(HttpRequest request) +86 
    System.Web.HttpContext.get_IsCustomErrorEnabled() +42 
    System.Web.Configuration.UrlAuthFailedErrorFormatter.GetErrorText(HttpContext context) +16 
    System.Web.Security.UrlAuthorizationModule.WriteErrorMessage(HttpContext context) +29 
    System.Web.Security.UrlAuthorizationModule.OnEnter(Object source, EventArgs eventArgs) +8777783 
    System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +68 
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75 
 

¿Es correcto usar la pertenencia y la costumbre IIdentity y IPrincipal al mismo tiempo? Si no, ¿dónde agregar propiedades como la contraseña u otros datos de usuario si utilizo la membresía y los proveedores de funciones?

Saludos,

Stephane Erbrech

+0

@serbrech: si amablemente vuelve a leer su pregunta, seguramente se dará cuenta de que no ha publicado la excepción. De hecho, tómese el tiempo para publicar la excepción * complete * atrapándola, y luego publique el resultado de 'ex.ToString()'. –

+0

acaba de agregar la excepción que recibo, si ayuda –

+0

@serbrech: gracias. ¿Es su 'CW.CustomAuthentication.CWIdentity' serializable? ¿Has probado que se puede serializar usando 'BinaryFormatter'? –

Respuesta

8

después de algunas pruebas más, de acuerdo con lo que el enlace que he publicado Dicho esto, parece que este error ocurre sólo cuando corro en el modo de depuración de Visual Studio. Si configuro el proyecto para que se ejecute en IIS, el error desaparecerá y la implementación de seguridad funcionará como se esperaba.

--- Es que un error en el servidor web ligero implementado en Visual Studio entonces ---

Editar:? Usted puede ir en las propiedades de su proyecto web, vaya a la pestaña "Web", y marque "Usar servidor IIS local". Sin embargo, esto requerirá que ejecute Visual Studio como administrador y que tenga IIS instalado en su máquina, para que VS pueda crear el directorio virtual en el servidor IIS local cuando carga el proyecto.

+0

¿Alguien ha descubierto por qué ocurre esto? –

+0

:) ¡Muchas gracias! –

2

Puede ir a Propiedades de su proyecto web, ir a la pestaña "Web" y marcar "Usar servidor IIS local". Sin embargo, esto requerirá que ejecute Visual Studio como administrador y que tenga IIS instalado en su máquina, para que VS pueda crear el directorio virtual en el servidor IIS local cuando carga el proyecto.

Tuve el mismo problema al intentar ejecutar la aplicación web con CustomIdentity. Para configurar el proyecto para usar su IIS en VS 2008, deberá definir la URL para su grupo de aplicaciones en su proyecto de aplicación web.

4

Puede que esta no sea la respuesta correcta, pero también tuve este problema pero lo solucioné.

Originalmente, acabo de tener una clase personalizada que heredó GenericIdentity (o implícita IIdentity). Cuando finalmente creé una clase personalizada que heredaba GenericPrincipal (o implícita IPrincipal), ¿todo funcionó?

Mi clase CustomPrincipal no hizo nada más que heredar de GenericPrincipal y tenía un constructor que llamaba al constructor base.

Las clases CustomPrincipal y CustomIdentity NO implicaron ningún Serialization o ISerializable cosas. Por otra parte, mis clases eran todas muy básicas.

+1

¿Entonces la solución fue agregar '[Serializable]'? – jgauffin

+0

: sonrojo: no lo recuerdo ahora, fue hace un tiempo. Depende de lo que coloque dentro de su 'CustomPrincipal' o (más parecido) su 'CustomIdentity'. Si está guardando una clase personalizada allí, entonces sí ... Creo que tenía que hacerlo. He ido a desmantelar mis clases 'CustomIdentity' para contener únicamente cadenas o tipos primitivos. –

5

En mi caso, simplemente tuve que heredar de MarshalByRefObject.

public class IcmtrIdentity : MarshalByRefObject, IIdentity 
{ 
    ... 
} 
+0

No estoy contento con eso, pero esto funcionó para mí. –

1

Esto también se puede resolver agregando el conjunto que contiene su identidad personalizada al GAC en su máquina de desarrollo.

Cuestiones relacionadas