c# - management - Obtención de grupos de Azure Active Directory en el proyecto principal de asp.net
panel azure login (1)
Creé un nuevo proyecto con Visual Studio 2015 y habilité la autenticación con las cuentas del trabajo y la escuela en contra de Azure Active Directory. Aquí es cómo se ve la función de configuración generada:
app.UseStaticFiles();
app.UseCookieAuthentication();
app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions
{
ClientId = Configuration["Authentication:AzureAd:ClientId"],
ClientSecret = Configuration["Authentication:AzureAd:ClientSecret"],
Authority = Configuration["Authentication:AzureAd:AADInstance"] + Configuration["Authentication:AzureAd:TenantId"],
CallbackPath = Configuration["Authentication:AzureAd:CallbackPath"],
ResponseType = OpenIdConnectResponseType.CodeIdToken
});
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
Aquí está el código de acción rudimentaria que intenta obtener grupos de usuarios:
public async Task<IActionResult> Index()
{
var client = new HttpClient();
var uri = "https://graph.windows.net/myorganization/users/{user_id}/$links/memberOf?api-version=1.6";
var response = await client.GetAsync(uri);
if (response.Content != null)
{
ViewData["response"] = await response.Content.ReadAsStringAsync();
}
return View();
}
¿Qué necesito para usar o cambiar este código para asegurarme de que puedo obtener grupos de usuarios? Actualmente, la respuesta es:
{
"odata.error":{
"code":"Authentication_MissingOrMalformed",
"message":{
"lang":"en",
"value":"Access Token missing or malformed."
},
"values":null
}
}
Pasé los últimos 2 días tratando de resolver esto y finalmente lo conseguí. Azure AD es un objetivo móvil y, dado que ASPNETCORE aún está madurando, la mayoría de la documentación sobre cómo acceder a Azure AD Graph no está actualizada. Así que a partir de ahora, así es como se haría para acceder a Azure AD Graph.
- Toma nota de la clientela de tu aplicación
- Registre su aplicación con Azure Active Directory
- Genere una clave en ese registro y tome nota de ella (solo puede verla justo después de crearla)
- Tome nota de su ''Nombre del inquilino'' (también puede usar la ID del inquilino)
Luego, utilizará la información anterior para generar un token de acceso, luego la usará para hacer llamadas al gráfico.
public async void GetUsers()
{
// Get OAuth token using client credentials
string tenantName = "your-tenant-name.onmicrosoft.com";
string authString = "https://login.microsoftonline.com/" + tenantName;
AuthenticationContext authenticationContext = new AuthenticationContext(authString, false);
// Config for OAuth client credentials
string clientId = "your-client-id";
string key = "your-AzureAD-App-Key";
ClientCredential clientCred = new ClientCredential(clientId, key);
string resource = "https://graph.windows.net";
AuthenticationResult authenticationResult;
try
{
authenticationResult = await authenticationContext.AcquireTokenAsync(resource, clientCred);
}
catch(Exception ex)
{
throw new Exception(ex.Message, ex.InnerException);
}
var client = new HttpClient();
var request = new HttpRequestMessage(System.Net.Http.HttpMethod.Get, "https://graph.windows.net/your-tenant-name.onmicrosoft.com/users?api-version=1.6");
request.Headers.Authorization =
new AuthenticationHeaderValue("Bearer", authenticationResult.AccessToken);
var response = await client.SendAsync(request);
var content = await response.Content.ReadAsStringAsync();
}
Otro problema importante que puede encontrar con el que me encontré y que varios foros están discutiendo es si recibe un error de Autorización_Request_Denied o Insufficient_Permissions. Esto se resuelve ejecutando un comando de PowerShell para otorgar a la aplicación que se registró con los permisos de "Administrador" de Azure AD. Las solicitudes a la API de MS Graph me dan "Solicitud de autorización denegada: privilegios insuficientes para completar la operación"
El comando de PowerShell que quieres ejecutar es
Connect-MsolService
$ClientIdWebApp = ''{your_AD_application_client_id}''
$webApp = Get-MsolServicePrincipal –AppPrincipalId $ClientIdWebApp
#use Add-MsolRoleMember to add it to "Company Administrator" role).
Add-MsolRoleMember -RoleName "Company Administrator" -RoleMemberType ServicePrincipal -RoleMemberObjectId $webApp.ObjectId
Esperemos que esto ayude. Déjame saber si crees que se necesita hacer alguna refinación.