Вопрос

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

Он работает безукоризненно до тех пор, пока пользователю разрешено посещать страницу.но когда пользователю отказано, вместо того, чтобы выдавать AccessDeniedException , фреймворк выдает исключение сериализации для моего 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

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

С наилучшими пожеланиями,

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

Оба CustomPrincipal и CustomIdentity занятия НЕ подразумевали никаких Serialization или ISerializable всякое такое.С другой стороны, все мои занятия были очень простыми.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top