Подтвердить что ты не робот

MVC3: Может ли один контроллер требовать проверку подлинности Windows, а второй - анонимный?

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

Любые предложения?

4b9b3361

Ответ 1

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

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

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

Ответ 2

У нас есть несколько приложений, которые нужно делать именно так. Часто наши приложения заблокированы в файле 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 script сделает это за вас:

[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()

Ответ 3

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

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

   [Authorize]
    public ActionResult ChangePassword()
    {
       // your code here
    }