MVC3: Может ли один контроллер требовать аутентификацию Windows, а второй - анонимный? - PullRequest
12 голосов
/ 18 октября 2011

У меня есть один контроллер, который отображает страницы во внутреннем веб-приложении, для которого требуется проверка подлинности Windows.Существует второй контроллер, используемый для запросов на основе JSON в систему, которые НЕ должны проходить проверку подлинности Windows?Это возможно?Похоже, я только смог сделать одно или другое на данный момент.

Есть предложения?

Ответы [ 3 ]

9 голосов
/ 18 мая 2012

У нас есть несколько приложений, которые должны делать именно эту вещь. Часто наши приложения заблокированы в web.config:

<authentication mode="Windows"/>
<authorization>
  <allow roles="DOMAIN\GroupNameHere"/>
  <deny users="?"/>
</authorization>
<location path="ApiControllerName">
  <system.web>
    <authorization>
      <allow users="*"/>
    </authorization>
  </system.web>
</location>

Однако вам все равно придется отключить проверку подлинности Windows для этого контроллера API. Вы можете сделать это, отредактировав файл applicationHost.config на сервере IIS и добавив:

<location path="Default Web Site/ApplicationName/ApiControllerName">
    <system.webServer>
        <security>
            <authentication>
                <anonymousAuthentication enabled="true" />
                <windowsAuthentication enabled="false" />
            </authentication>
        </security>
    </system.webServer>
</location>

Этот скрипт PowerShell сделает это за вас:

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.Web.Administration")

$applicationLocationPath = "Default Web Site/ApplicationName/ApiControllerName"

$oIIS = new-object Microsoft.Web.Administration.ServerManager
$oGlobalConfig = $oIIS.GetApplicationHostConfiguration()

$oSection = $oGlobalConfig.GetSection("system.webServer/security/authentication/anonymousAuthentication", $applicationLocationPath)
$oSection.SetAttributeValue("enabled", "True")
$oSection = $oGlobalConfig.GetSection("system.webServer/security/authentication/windowsAuthentication", $applicationLocationPath)
$oSection.SetAttributeValue("enabled", "False")

$oIIS.CommitChanges()
6 голосов
/ 18 октября 2011

Да. Исходя из выбранной вами аутентификации, вы украшаете метод действия вашего контроллера с помощью Authorize

В этой статье представлено именно то, что вы ищете: http://www.asp.net/mvc/tutorials/authenticating-users-with-windows-authentication-cs

Из статьи "Например, контроллер Home в листинге 1 предоставляет три действия: Index (), CompanySecrets () и StephenSecrets (). Любой может вызывать действие Index (). Однако только члены локальная группа менеджеров Windows может вызывать действие CompanySecrets (). Наконец, только пользователь домена Windows с именем Stephen (в домене Redmond) может вызывать действие StephenSecrets (). "

0 голосов
/ 18 октября 2011

да, вы можете справиться с этим с помощью AuthorizeAttribute

Так, например, в простом контроллере учетных записей вы хотите, чтобы только авторизованные пользователи имели доступ к действию ChangePassword

   [Authorize]
    public ActionResult ChangePassword()
    {
       // your code here
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...