Расширение WindowsIdentity/WindowsPrincipal в
У меня есть приложение в MVC 4, ASP.NET 4.5 и Windows Authentication. Я пытаюсь расширить объекты Identity и Principal (WindowsIdentity и WindowsPrincipal соответственно), чтобы предоставить дополнительную информацию о пользователе, вошедшем в систему, но когда я пытаюсь создать расширенный экземпляр этих объектов и заменить Current.User, он выдает ошибка:
System.UnauthorizedAccessException: "Attempted to perform an unauthorized operation."
Ниже кода, который я использую в global.asax:
public void WindowsAuthentication_OnAuthenticate(object sender, WindowsAuthenticationEventArgs args)
{
if (!args.Identity.IsAnonymous)
{
var userData = WindowsUserDataHelper.GetWindowsUserData(args.Identity);
var user = new MyCustomPrincipal(new MyCustomIdentity(args.Identity.Name, userData));
HttpContext.Current.User = user; //-- exception thrown here
Thread.CurrentPrincipal = user;
}
}
Вот настройки web.config:
<authentication mode="Windows" >
</authentication>
<authorization>
<deny users="?" />
</authorization>
И в моем локальном IIS я установил аутентификацию следующим образом:
- Аноним: Отключено
- Базовый: отключен
- Аутентификация Windows: включена
- Проверка подлинности с помощью форм: отключено
- Олицетворение ASP.NET: отключено
1 ответ
Решение для моей проблемы было дано в этом вопросе: MVC3 Windows Authentication переопределяет User.Identity, в редактировании, которое пользователь сделал на свой собственный вопрос.
В основном, чтобы подвести итог: я делал замену принципала в случае public void WindowsAuthentication_OnAuthenticate(object sender, WindowsAuthenticateEventArgs args)
и я должен был сделать это в protected void Application_AuthorizeRequest(object sender, EventArgs e)
(что не совпадает с проверкой подлинности с помощью форм Application_AuthenticateRequest
).
Код в Global.asax заканчивается примерно так:
protected void Application_AuthorizeRequest(object sender, EventArgs e)
{
if (User.Identity.IsAuthenticated)
{
var userData = WindowsUserDataHelper.GetWindowsUserData((WindowsIdentity)User.Identity);
var user = new MyCustomPrincipal(new MyCustomIdentity(User.Identity.Name, userData));
HttpContext.Current.User = user;
Thread.CurrentPrincipal = user;
}
}
Отсюда Пользователь заменяется расширенной версией Принципала, а остальная часть приложения может использовать его из любого места (просмотр, контроллер и т. Д.).