8

Cerco di implementare l'autenticazione e l'autorizzazione di ASP.NET sopra il nostro database esistente. Abbiamo un sito Web che chiama un webservice per recuperare i suoi dati. Per utilizzare il servizio web, ho bisogno di fornire il nome utente e la password. Sapendo ciò, ho deciso di implementare IIdentity e IPrincipal per archiviare la password crittografata ed essere in grado di fornirla quando si eseguono chiamate al servizio web. In futuro, potremmo voler utilizzare più della sicurezza integrata di asp.net, quindi implemento l'appartenenza e il provider di ruoli e sovrascrivo solo ciò di cui ho bisogno (ValidateUser e GetRoles) Tuttavia, dopo aver convalidato l'utente grazie al implementazione del provider di appartenenze Sto ancora impostando la mia CustomIdentity su Context.User per poter recuperare la sua password quando necessario.SerializationException su 'CustomIdentity' quando l'utente è negato in ASP.NET

Funziona perfettamente finché l'utente è autorizzato a visitare la pagina. ma quando l'utente viene negato, invece di lanciare un'eccezione AccessDeniedException, il framework genera un'eccezione di serializzazione su CustomIdentity. Ho trovato un perfectly similar behaviour with more details described on this link, ma nessuna risposta è stata pubblicata.

La mia eccezione è esattamente lo stesso sul link qui sopra

 

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 
 

È corretto utilizzare l'appartenenza e personalizzato IIdentity e IPrincipal allo stesso tempo? In caso negativo, dove aggiungere proprietà come la password o altri dati utente se utilizzo i provider di appartenenza e ruolo?

Con i migliori saluti,

Stephane Erbrech

+0

@serbrech: se rileggete gentilmente la vostra domanda, noterete sicuramente che non avete pubblicato l'eccezione. In effetti, per favore prenditi il ​​tempo di postare l'eccezione * complete * catturandola, quindi pubblicando il risultato di 'ex.ToString()'. –

+0

appena aggiunto l'eccezione che ottengo, se aiuta –

+0

@serbrech: grazie. La tua 'CW.CustomAuthentication.CWIdentity' è serializzabile? Hai provato che può essere serializzato usando 'BinaryFormatter'? –

risposta

8

dopo un po 'di più test, secondo quanto il link che ho postato già detto, sembra che questo errore sta accadendo solo quando corro in modalità di debug da Visual Studio. Se imposto il progetto per l'esecuzione in IIS, l'errore è scomparso e l'implementazione della sicurezza funziona come previsto.

--- è che un bug nel server web leggero realizzato in Visual Studio allora ---

Edit:? Si può andare nelle proprietà del progetto Web, accedere alla scheda "Web", e selezionare "Usa server IIS locale". Tuttavia, ciò richiederà l'esecuzione di Visual Studio come amministratore e l'installazione di IIS sul computer, in modo che VS possa creare la directory virtuale nel server IIS locale quando carica il progetto.

+0

Qualcuno ha capito perché questo si verifica? –

+0

:) Grazie mille! –

2

È possibile accedere alle proprietà del progetto Web, passare alla scheda "Web" e selezionare "Usa server IIS locale". Tuttavia, ciò richiederà l'esecuzione di Visual Studio come amministratore e l'installazione di IIS sul computer, in modo che VS possa creare la directory virtuale nel server IIS locale quando carica il progetto.

Ho riscontrato lo stesso problema durante il tentativo di eseguire l'app Web tramite CustomIdentity. Per impostare il progetto in modo che utilizzi IIS in VS 2008, sarà necessario definire l'URL del pool di applicazioni nel progetto di applicazione Web.

4

Questa potrebbe non essere la risposta corretta, ma ho avuto anche questo problema ma l'ho risolto.

Originariamente, ho appena avuto una classe personalizzata che ha ereditato GenericIdentity (o impiantato IIdentity). Quando ho finalmente creato una classe personalizzata che ha ereditato GenericPrincipal (o impiantato IPrincipal), allora tutto ha funzionato?

la mia classe CustomPrincipal non ha fatto altro che ereditare da GenericPrincipal e aveva un costruttore che ha chiamato il costruttore di base.

Sia i CustomPrincipal e CustomIdentity classi non ha impliment qualsiasi roba Serialization o ISerializable. Poi di nuovo, le mie lezioni erano tutte molto semplici.

+1

Quindi la soluzione era aggiungere '[Serializable]'? – jgauffin

+0

: arrossire: non riesco a ricordare ora - era un po 'di tempo fa. Dipende da cosa stai mettendo dentro il tuo 'CustomPrincipal' o (più likey) il tuo 'CustomIdentity'. Se stai salvando una lezione personalizzata lì, allora sì ... Penso che dovessi. Sono andato a spogliare le mie classi 'CustomIdentity' per contenere solo stringhe o intere o tipi primitivi. –

5

Nel mio caso, ho dovuto ereditare semplicemente da MarshalByRefObject.

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

Non ne sono felice, ma ha funzionato per me. –

1

Questo problema può essere risolto aggiungendo l'assembly contenente l'identità personalizzata al GAC sulla macchina di sviluppo.

Problemi correlati