Autenticación con Azure Active Directory: cómo aceptar las credenciales de usuario mediante progtwigción

¿Hay alguna forma de iniciar sesión a través de una aplicación web o una api web para Azure Active Directory (con credenciales de AD) usando mi propio nombre de usuario y página de contraseña que se encuentra fuera de Azure?

Según mi investigación, parece que no hay una manera programática de enviar un nombre de usuario y una contraseña para autenticar a los usuarios con Azure AD (si usted hospedó una aplicación fuera de Azure) No estoy seguro de que consideren esto como un agujero de seguridad de algún tipo (no lo creo ¿Es https se hace cumplir?)

Parece que solo se puede autenticar a los usuarios mediante la concesión del código (lo que significa salir de nuestra aplicación para iniciar sesión en un sitio externo).

En última instancia, quiero crear una api de flask de python que pueda autenticarse directamente en Azure AD si es posible. He hecho esto en el pasado (con otros sistemas de autenticación) con Oauth grant_type = contraseña para enviar el nombre de usuario y la contraseña, pero no creo que esto sea compatible con Azure AD (¿me corrija si estoy equivocado?) Sé que grant_type = client_credentials es compatible, pero eso parece ser su servicio al servicio de autenticación, que no es exactamente lo que im después de http://msdn.microsoft.com/en-us/library/azure/dn645543.aspx

Si no es posible tener una página de inicio de sesión alojada fuera de Azure para esto, ¿es posible tener una dentro de Azure, como se ve en los ejemplos aquí: http://msdn.microsoft.com/en-us/library/azure? / bc8af4ff-66e7-4d5b-b3d4-c33d2c55d270 # BKMK_Browser No hay una página de inicio de sesión personalizada con un campo de contraseña.

Azure Active Directory admite el flujo de concesión de credenciales de contraseña del propietario del recurso ( grant_type=password ). Sin embargo, antes de usarlo, considere si es realmente necesario. Como dice el OAuth 2.0 RFC:

Las credenciales de la contraseña del propietario del recurso (es decir, nombre de usuario y contraseña) se pueden usar directamente como una concesión de autorización para obtener un token de acceso. Las credenciales solo deben usarse cuando existe un alto grado de confianza entre el propietario del recurso y el cliente (por ejemplo, el cliente es parte del sistema operativo del dispositivo o una aplicación altamente privilegiada), y cuando otros tipos de concesión de autorización no están disponibles ( como un código de autorización) .

Si ha determinado que los otros flujos admitidos definitivamente no funcionarán para su escenario, entonces también asegúrese de seguir el segundo consejo en la RFC:

Aunque este tipo de concesión requiere acceso directo del cliente a las credenciales del propietario del recurso, las credenciales del propietario del recurso se utilizan para una sola solicitud y se intercambian por un token de acceso. Este tipo de concesión puede eliminar la necesidad de que el cliente almacene las credenciales del propietario del recurso para su uso futuro, al intercambiar las credenciales con un token de acceso de larga duración o token de actualización .

(Énfasis agregado en ambos casos.)

Hay un ejemplo de .NET y ADAL en GitHub que usa este flujo, y debería ser lo suficientemente sencillo de implementar en Python: https://github.com/AzureADSamples/NativeClient-Headless-DotNet

Edición: puede alojar su aplicación en cualquier lugar que desee, no es necesario que esté en Azure. Esto se aplica a todos los flujos.