Расширение 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;
        }
    }

Отсюда Пользователь заменяется расширенной версией Принципала, а остальная часть приложения может использовать его из любого места (просмотр, контроллер и т. Д.).