2011-10-18 7 views
12

Tengo un controlador que procesa páginas en una aplicación web interna que necesita ser autenticada en Windows. Existe un segundo controlador utilizado para consultas basadas en JSON en el sistema que NO necesita ser Windows autenticado? ¿Es eso posible? Parece que solo he podido hacer uno u otro en este momento.MVC3: ¿Puede un controlador requerir Autenticación de Windows, mientras que un segundo permite el anonimato?

¿Alguna sugerencia?

+1

"sólo ha sido capaz de hacer uno o el otro", ¿cómo exactamente hiciste entonces? – bzlm

+0

¿Cómo se ha habilitado exactamente la autenticación de Windows? – gideon

+0

La configuración de IIS tiene habilitada la Autenticación de Windows y también permite Anónimo. Web.config tiene . Agregué el atributo [Autorizar] al controlador que necesitaba proteger y lo dejé fuera del controlador que quería exponer. – Shawn

Respuesta

6

Sí. Sobre la base de lo que la autenticación que elija, usted adorna método acción del controlador con Authorize

En este artículo se presenta exactamente lo que busca: http://www.asp.net/mvc/tutorials/authenticating-users-with-windows-authentication-cs

Desde el artículo "Por ejemplo, el controlador principal en el Listado 1 expone tres acciones denominadas Index(), CompanySecrets() y StephenSecrets(). Cualquiera puede invocar la acción Index(). Sin embargo, solo los miembros del grupo de administradores locales de Windows pueden invocar la acción CompanySecrets(). Finalmente, solo el Windows el usuario de dominio llamado Stephen (en el dominio de Redmond) puede invocar la acción StephenSecrets() ".

0

sí se puede manejar esto con AuthorizeAttribute

Así por ejemplo, en un controlador simple cuenta solo deseas usuarios autorizados para acceder a la Acción ChangePassword

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

Tenemos algunas aplicaciones que necesitan hacer esto exactamente. A menudo, nuestras aplicaciones están bloqueados en el 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> 

Sin embargo, todavía se tiene que apagar la autenticación de Windows para que el controlador de API. Usted puede hacer esto mediante la edición del archivo applicationHost.config en el servidor IIS y añadiendo:

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

Este script PowerShell lo hará por usted:

[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

¡Usted, señor, me salvó la vida! – 130nk3r5

Cuestiones relacionadas