MVC3:一个控制器是否需要Windows身份验证,而第二个允许匿名?

时间:2011-10-18 17:58:15

标签: asp.net-mvc asp.net-mvc-3 authentication

我有一个控制器在内部Web应用程序中呈现需要进行Windows身份验证的页面。是否存在第二个控制器,用于基于JSON的查询到系统中,不需要进行Windows身份验证?那可能吗?看来我现在只能做一个或另一个。

有什么建议吗?

3 个答案:

答案 0 :(得分:9)

我们有一些应用需要做这件事。通常,我们的应用程序被锁定在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>

但是,您仍然必须关闭该API控制器的Windows身份验证。您可以通过编辑IIS服务器上的applicationHost.config文件并添加:

来完成此操作
<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()

答案 1 :(得分:6)

是。根据您选择的身份验证,您可以使用Authorize

来装饰控制器的操作方法

本文准确介绍了您的需求: http://www.asp.net/mvc/tutorials/authenticating-users-with-windows-authentication-cs

从文章“例如,清单1中的Home控制器公开了三个名为Index(),CompanySecrets()和StephenSecrets()的动作。任何人都可以调用Index()动作。但是,只有成员Windows本地管理器组可以调用CompanySecrets()操作。最后,只有名为Stephen的Windows域用户(在Redmond域中)可以调用StephenSecrets()操作。“

答案 2 :(得分:0)

是的,您可以使用AuthorizeAttribute

处理此问题

例如,在简单的帐户控制器中,您只希望授权用户访问操作ChangePassword

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