8

Próbuję zaimplementować uwierzytelnianie ASP.NET i autoryzację na bazie naszej istniejącej bazy danych. Mamy stronę internetową, która wzywa serwis internetowy do pobierania swoich danych. Aby korzystać z usługi internetowej, muszę podać nazwę użytkownika i hasło. Wiedząc o tym, postanowiłem wdrożyć IIdentity i IPrincipal do przechowywania zaszyfrowanego hasła i być w stanie zapewnić je podczas wykonywania wywołań usługi sieci web. W przyszłości możemy chcieć użyć więcej wbudowanych zabezpieczeń asp.net, więc zaimplementuję członkostwo i dostawcę roli i nadpisuję tylko to, czego potrzebuję (ValidateUser i GetRoles) Jednak po sprawdzeniu użytkownika dzięki implementacja dostawcy członkostwa Wciąż konfiguruję własne CustomIdentity do Context.User, aby móc odzyskać swoje hasło w razie potrzeby.Wyjątek seryjny wyjątku dla "CustomIdentity", gdy użytkownik jest odmowy w ASP.NET

Działa idealnie, o ile użytkownik może odwiedzać tę stronę. ale gdy użytkownik zostanie odmówiony, zamiast wyrzucać wyjątek AccessDeniedException, struktura zgłasza wyjątek Serializacji dla mojego CustomIdentity. Znalazłem perfectly similar behaviour with more details described on this link, ale nie napisano żadnej odpowiedzi.

Moja Wyjątkiem jest dokładnie taka sama jak w linku powyżej

 

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 
 

Czy to prawidłowe użycie członkowską i niestandardowe IIdentity i IPrincipal w tym samym czasie? Jeśli nie, to gdzie dodać właściwości, takie jak hasło lub inne dane użytkownika, jeśli korzystam z dostawców członkostwa i roli?

poważaniem,

Stephane Erbrech

+0

@serbrech: jeśli zechcesz ponownie przeczytać swoje pytanie, na pewno zauważysz, że nie opublikowałeś wyjątku. W rzeczywistości, poświęć trochę czasu, aby opublikować wyjątek * complete *, przechwytując go, a następnie publikując wynik 'ex.ToString()'. –

+0

Właśnie dodałem wyjątek, który otrzymuję, jeśli pomaga –

+0

@serbrech: thanks. Czy można przekształcić swoje 'CW.CustomAuthentication.CWIdentity'? Czy przetestowałeś, że można go serializować za pomocą 'BinaryFormatter'? –

Odpowiedz

8

po pewnym więcej testów, zgodnie z tym, co powiedział Link Zamieściłem, wydaje się, że ten błąd występuje tylko wtedy, gdy uruchomiony w trybie debugowania z visual studio. Jeśli ustawię projekt, aby działał w IIS, błąd zniknął, a implementacja zabezpieczeń działa zgodnie z oczekiwaniami.

--- Czy to błąd w lekkiej serwer WWW wdrożone w Visual Studio następnie ---

Edit: Można iść w oknie Właściwości projektu strony internetowej, przejdź do zakładki „WWW” i zaznacz "Użyj lokalnego serwera IIS". Wymaga to jednak uruchomienia programu Visual Studio jako administratora i zainstalowania usług IIS na komputerze, aby program VS mógł utworzyć katalog wirtualny na lokalnym serwerze IIS podczas ładowania projektu.

+0

Ktoś się domyślił, dlaczego tak się dzieje? –

+0

:) Wielkie dzięki! –

2

Możesz przejść do Właściwości swojego projektu internetowego, przejść do zakładki "Sieć" i sprawdzić "Użyj lokalnego serwera IIS". Wymaga to jednak uruchomienia programu Visual Studio jako administratora i zainstalowania usług IIS na komputerze, aby program VS mógł utworzyć katalog wirtualny na lokalnym serwerze IIS podczas ładowania projektu.

Miałem ten sam problem podczas próby uruchomienia aplikacji internetowej przy użyciu CustomIdentity. Aby ustawić projekt na używanie usług IIS w VS 2008, musisz zdefiniować adres URL do puli aplikacji w projekcie aplikacji sieci Web.

4

To może nie być poprawna odpowiedź, ale miałem ten problem również, ale go naprawiłem.

Pierwotnie miałem niestandardową klasę, która odziedziczyła GenericIdentity (lub implimented IIdentity). Kiedy w końcu utworzyłem klasę niestandardową, która odziedziczyła GenericPrincipal (lub implimented IPrincipal), to wszystko zadziałało?

Moja klasa CustomPrincipal nic nie zrobiła, ale odziedziczyła po GenericPrincipal i miała jednego konstruktora, który nazwał konstruktora podstawowego.

Zarówno klasy CustomPrincipal, jak i CustomIdentity NIE implikowały żadnych rzeczy o kodzie Serialization lub ISerializable. Z drugiej strony moje zajęcia były bardzo podstawowe.

+1

Więc rozwiązaniem było dodanie '[Serializable]'? – jgauffin

+0

: rumieniec: Nie pamiętam teraz - to było chwilę temu. To zależy od tego, co umieszczasz w swoim 'CustomPrincipal' lub (bardziej jak) swoim 'CustomIdentity'. Jeśli zapisujesz tam niestandardową klasę, to tak ... Myślę, że musiałem. Poszedłem do rozebrania moich klas 'CustomIdentity', aby zawierały tylko ciągi lub znaki typu int lub prymitywne. –

5

W moim przypadku musiałem po prostu odziedziczyć po MarshalByRefObject.

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

Nie jestem z tego zadowolony, ale to zadziałało. –

1

Można to również rozwiązać, dodając zespół zawierający niestandardową tożsamość do GAC na komputerze dev.

Powiązane problemy