with practices example best c# asp.net-mvc-4 asp.net-web-api

c# - practices - Deshabilitar la autenticación de Windows para WebAPI



web api security best practices c# (3)

Estoy jugando con una aplicación MVC4 y utilizando WebAPI para buscar / enviar todos mis datos. En un controlador, estoy usando una solicitud de HttpClient para obtener los datos y todo funciona bien. El problema al que me enfrento es que cuando la autenticación de Windows está habilitada en el proyecto, las llamadas a la API web devuelven un error 401 no autorizado.

el código en mi controlador que hace la llamada es:

using (var client = new HttpClient()) { var invoiceDetailUrl = BASE_URL + Url.HttpRouteUrl( "DefaultApi", new { controller = "InvoiceDetails", id = id } ); var result = client.GetAsync(invoiceDetailUrl).Result; }

La autenticación de Windows debe estar activada para el sitio, pero no necesariamente para los controladores de la API web. He intentado excluir los controladores de API en el web.config como a continuación:

<location path="api"> <system.web> <authorization> <allow users="*"/> </authorization> </system.web> </location>

pero las adiciones a web.config no hicieron nada.

¿Alguna sugerencia?


Autenticación

La API web asume que la autenticación ocurre en el host. IIS usa módulos HTTP para la autenticación. asp.net ahora le permite configurar a través de web.config cualquiera de los módulos de autenticación integrados en IIS o ASP.NET, o escribir su propio módulo HTTP para realizar una autenticación personalizada.

Puede usar múltiples autenticaciones al mismo tiempo, no es un problema. En su caso, necesita autenticación de Windows y autenticación anónima . La autenticación de Windows protegerá su sitio web y la autenticación anónima abrirá su API web.

Configurar autenticación en IIS

Alojamiento en IIS Express Abra el panel Propiedades (a través de F4 y no las propiedades del proyecto) y aplique la autenticación deseada Establezca "Autenticación anónima" en "Desactivado". Establezca "Autenticación de Windows" en "Habilitado".

Alojando en IIS 7 o posterior En el Administrador de IIS, abra la función Autenticación en la vista de características. Habilita / deshabilita la autenticación deseada. Si un sistema de autenticación no es una opción (como Windows), deberá instalarlo a través del Administrador del servidor (Agregar servicios de rol).

Autorización

Autorización asp.net

En ASP.NET, hay dos formas de autorizar el acceso a un recurso determinado: Archivo y autorización de Url. No lo explicaré aquí pero puedes leer este article .

Lo importante es que puedes permitir / denegar usuarios y / o grupos en web.config.

La configuración predeterminada en la autenticación de Windows es permitir solo usuarios de autenticación *****, como este:

<authorization> <deny users="?" ></deny> </authorization>

Si desea permitir usuarios anónimos ? debajo de la ubicación de la url "api", agregue esto:

<location path="api"> <system.web> <authorization> <allow users="*"/> </authorization> </system.web> </location>

Autorización de API web

asp.net Web Api Authorization sucede más adelante en la tubería, más cerca del controlador. Eso le permite tomar decisiones más detalladas cuando otorga acceso a los recursos.

Web API proporciona un filtro de autorización incorporado, AuthorizeAttribute . También hay un AllowAnonymousAttribute . Puede usarlo globalmente, en un controlador o en una acción. Por defecto, todas las acciones están autorizadas .

Prueba Api

A través del navegador

La autenticación integrada de Windows funciona con cualquier navegador que admita el esquema de autenticación Negociar. Es el lugar para Internet Explorer y ahora Chrome: proporcionarán automáticamente credenciales de Windows cuando naveguen por un sitio web con autenticación de Windows. Firefox no es compatible con este esquema, por lo que a menudo pruebo la autenticación con este navegador.

A través de HttpClient Su HttpClient necesita proporcionar Credenciales cuando invoca la API web (como los navegadores). Esto se hace configurando un HttpClientHandler con las credenciales apropiadas.

//use default credentials aka Windows Credentials HttpClientHandler handler = new HttpClientHandler() { UseDefaultCredentials = true }; //use username/password credentials HttpClient client = new HttpClient(handler); var handler = new HttpClientHandler { Credentials = new NetworkCredential(username, password) }; var httpClient = new HttpClient(handler);

Espero que esto te ayudará.

Una última cosa importante en su caso, es que su API web no permite usuarios anónimos en absoluto . Como está utilizando credenciales predeterminadas en su HttpClientHandler, esto significa que su servicio requiere autenticación de Windows. No tiene que configurar ninguna credencial en un servicio abierto y público.


Esto es lo que necesitaba hacer:

<location path="api"> <system.web> <authorization> <allow users="*"/> </authorization> </system.web> </location>


Me encontré con esta pregunta al tratar de hacer algo muy similar y quería agregar a la respuesta dada anteriormente. No he encontrado mucha información detallada sobre cómo hacer esto. Solo partes y piezas en toda la web. Así que con suerte esto se agregará a lo que hay por ahí.

Tengo una aplicación MVC4 que tiene una parte WebAPI. La aplicación MVC necesita usar autenticación de Windows, pero la parte de WebAPI debe ser anónima y tener la autenticación de Windows desactivada. Si bien la solución anterior funcionaba para ncbl, no funcionó para mí porque en mi caso no estaba usando el código para manejar las credenciales. En mi caso, quería una solución basada en web.config o IIS. Empecé con la solución web.config de Cybermaxs y la agregué. Esto es con lo que terminé.

<!-- Configure the virtual path api --> <!-- This section is like a mini-web.config for the virtual path --> <location path="api"> <system.web> <authorization> <!-- All anonymous users access to the virtual path api --> <allow users="?" /> </authorization> </system.web> <!-- Need to include the security overrides else it will inherit from the root of the application --> <system.webServer> <security> <authentication> <!-- Need to enable anonymous access and turn off Windows authentication for the virtual path --> <anonymousAuthentication enabled="true"/> <windowsAuthentication enabled="false"/> </authentication> </security> </system.webServer> </location>

La clave para mí fue agregar la sección <system.webServer> al web.config para poder anular la autenticación para esta ruta virtual. Intenté hacer esto en IIS, pero como era una ruta virtual, es decir, / api no existe en el servidor web, esto no me fue posible.

Nota: Tenga en cuenta que IIS puede tener un archivo de configuración en un nivel de configuración más alto que esté bloqueando la sección <authentication> , como en el application.config o machine.config. Un elemento puede tener el atributo allowOverride establecido en falso. Obtuve un error HTTP 500.19 (HRESULT: 0x80070021) al principio y tuve que acceder al archivo application.config para cambiar este atributo. Encontré más detalles sobre este error here .

Una vez que tuve esta sección adicional en la sección <location> de mi web.config, me aseguré de decorar mi controlador api con [AllowAnonymous] . Entonces bam ... todo comenzó a funcionar.

Así es como tengo la configuración de autenticación y autorización para la raíz de mi aplicación.

<system.web> <authentication mode="Windows" /> <authorization> <!-- Deny all anonymous users at the root of the application --> <deny users="?" /> </authorization> </system.web>