tenant office microsoftonline common autenticacion application active c# azure active-directory oauth-2.0 microsoft-graph

c# - office - https login microsoftonline com/{ tenant}/ oauth2 v2 0 token



Error de solicitud de token de acceso de Azure AD OAuth2-400 Bad Request (2)

Mi aplicación de escritorio WPF (C #) está intentando leer los correos electrónicos de Outlook del usuario a través de la API de Microsoft Graph. Estoy atrapado en el proceso de autenticación; Ya recibí un código de autenticación y ahora estoy tratando de obtener un token de acceso de Azure, pero sigo obteniendo un código de error HTTP 400 al enviar la solicitud del token de acceso :

/**** Auth Code Retrieval ****/ string authCodeUrl = "https://login.microsoftonline.com/common/oauth2/authorize"; authCodeUrl += "?client_id" = clientId; authCodeUrl += "&redirect_uri=" + redirectUri; authCodeUrl += "&response_type=code"; authCodeUrl += "&resource=https%3A%2F%2Fgraph.microsoft.com%2F"; Process.start(authUrl); // User logs in, we get the auth code after login string code = "......"; // Hidden for this post /**** Access Token Retrieval ****/ string tokenUrl = "https://login.microsoftonline.com/common/oauth2/token" string content = "grant_type=authorization_code"; content += "&client_id=" + clientId; content += "&resource=https%3A%2F%2Fgraph.microsoft.com%2F"; content += "&code=" + code; content += "&redirect_uri=" + redirectUri; WebRequest request = WebRequest.Create(tokenUrl); request.ContentType = "application/x-www-form-urlencoded"; byte[] data = Encoding.UTF8.GetBytes(content); request.ContentLength = data.Length; request.Method = "POST"; try { using (Stream stream = request.GetRequestStream()) { stream.Write(data, 0, data.Length); } WebResponse response = request.GetResponse(); // This throws exception } catch (Exception error) // This catches the exception { Console.WriteLine(error.Message); // Outputs 400, bad request }

Lo anterior es el código utilizado para recuperar el código de autenticación seguido del intento de recuperar el token de acceso. No tenemos un client_secret porque los secretos son solo para aplicaciones web y esta es una aplicación nativa de escritorio WPF. He leído que esto no es un problema. He seguido muchos tutoriales y documentos oficiales en línea, principalmente el documento oficial de Autorización de Gráficos y todavía no puedo entender lo que estoy haciendo mal. Cualquier ayuda será enormemente apreciada, gracias.


Si no usa un secreto de cliente, entonces necesita configurar su inquilino para que admita flujo de concesión implícito. Puede seguir las instrucciones de esta publicación de blog para realizar / validar la configuración. Esto requiere utilizar el portal de administración de Azure para descargar, modificar el manifiesto de la aplicación y cargarlo.

Alternativamente, y posiblemente una mejor estrategia, es cambiar su código a usar los puntos finales de autenticación convergentes v2.0 . Permite la gestión de su aplicación utilizando el nuevo portal de registro de aplicaciones y soporta de forma adecuada el flujo implícito y los ámbitos dinámicos. Puede encontrar más información sobre el flujo de autenticación real aquí . No está lejos de lo que estás haciendo ahora y solo requiere algunos pequeños retoques.

Si aún tienes problemas después de esto, vuelve a comunicarte. Un rastro de violinista / red sería muy útil. Además, el mensaje detallado dentro de la excepción también sería muy útil.


Utilicé fiddler para depurar la solicitud y encontré el mensaje de error completo: El usuario o el administrador no ha dado su consentimiento para usar la aplicación . Busqué en Google este mensaje por un tiempo y encontré algunos artículos de pila y subprocesos de github que me llevaron a la solución: mi solicitud había estado usando "común" en la URL base como identificador de inquilino cuando realmente necesitaba usar mi inquilino de Azure ID que adquirí a través de esta respuesta en la pila . Mi nueva URL base para las solicitudes de autenticación ahora se ve así:

https://login.microsoftonline.com/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/oauth2/authorize

donde "xxxx -.... xxx" sería reemplazado por su ID de inquilino Azure!