СериализацияException в "CustomIdentity", когда пользователь отказывается в ASP.NET

Я пытаюсь реализовать аутентификацию и авторизацию ASP.NET поверх нашей существующей базы данных. У нас есть веб-сайт, который вызывает веб-сервис для извлечения его данных. Чтобы использовать веб-сервис, мне нужно указать имя пользователя и пароль. Зная это, я решил реализовать IIdentity и IPrincipal, чтобы хранить зашифрованный пароль и быть в состоянии обеспечить его при выполнении вызовов webservice. В будущем мы можем использовать больше встроенной безопасности asp.net, поэтому я реализую членство и роль поставщика и переопределяю только то, что мне нужно (ValidateUser и GetRoles) Хотя после проверки пользователя благодаря реализации поставщика членства я все еще устанавливаю свой собственный пользовательский интерфейс для Context.User, чтобы иметь возможность получить его пароль при необходимости.

Он работает отлично, пока пользователю разрешено посещать страницу. но когда пользователю отказывают, вместо того, чтобы бросать AccessDeniedException, среда генерирует исключение Serialization в моем CustomIdentity. Я нашел совершенно аналогичное поведение с более подробной информацией, описанной в этой ссылке, но ответ не был отправлен.

Мое исключение точно такое же, как в ссылке выше


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

Правильно ли использовать одновременно членство и пользовательские IIdentity и IPrincipal? Если нет, где добавить свойства, такие как пароль или другие пользовательские данные, если я использую поставщиков членства и роли?

С уважением,

Стефан Эрбрех

+8
14 авг. '09 в 11:27
источник поделиться
5 ответов

после некоторого тестирования, в соответствии с тем, что я сказал в сообщении, кажется, что эта ошибка происходит только тогда, когда я запускаю режим отладки из visual studio. Если я установил запуск проекта в IIS, ошибка исчезнет, ​​и реализация безопасности будет работать должным образом.

--- Это ошибка в облегченном веб-сервере, реализованном в Visual Studio? ---

Изменить: Вы можете войти в Свойства вашего веб-проекта, перейдите на вкладку "Веб" и отметьте "Использовать локальный сервер IIS". Однако для этого потребуется запустить Visual Studio в качестве администратора и установить IIS на вашем компьютере, чтобы VS мог создать виртуальный каталог на локальном сервере IIS при загрузке проекта.

+8
17 авг. '09 в 10:01
источник

В моем случае я просто должен был наследовать от MarshalByRefObject.

public class IcmtrIdentity :  MarshalByRefObject, IIdentity
{
   ...
}
+5
03 окт. '12 в 13:18
источник

Это может быть неправильный ответ, но у меня была эта проблема, но она была исправлена.

Первоначально у меня только был пользовательский класс, унаследованный GenericIdentity (или implieded IIdentity). Когда я наконец создал пользовательский класс, который наследовал GenericPrincipal (или implieded IPrincipal), все это сработало?

my CustomPrincipal класс ничего не делал, но унаследовал от GenericPrincipal и имел один конструктор, который вызывал базовый конструктор.

Оба класса CustomPrincipal и CustomIdentity НЕ вливались в какие-либо вещи Serialization или ISerializable. И снова мои занятия были очень простыми.

+4
21 мар. '11 в 8:07
источник

Вы можете войти в Свойства своего веб-проекта, перейдите на вкладку "Веб" и отметьте "Использовать локальный сервер IIS". Однако для этого потребуется запустить Visual Studio в качестве администратора и установить IIS на вашем компьютере, чтобы VS мог создать виртуальный каталог на локальном сервере IIS при загрузке проекта.

У меня была такая же проблема при попытке запустить веб-приложение с помощью CustomIdentity. Чтобы настроить проект на использование IIS в VS 2008, вам нужно будет определить URL-адрес вашего пула приложений в проекте веб-приложения.

+2
07 мар. '11 в 16:10
источник

Это также можно решить, добавив сборку, содержащую ваш пользовательский идентификатор, в GAC на вашей машине dev.

+1
16 апр. '13 в 1:29
источник

Посмотрите другие вопросы по меткам или Задайте вопрос