Visual Studio 2015を使用して新しいプロジェクトを作成し、Azure Active Directoryに対して職場と学校のアカウントを使用した認証を有効にしました。生成された構成関数は次のようになります。
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?}");
});
ユーザーグループを取得しようとする基本的なアクションコードを次に示します。
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();
}
ユーザーグループを確実に取得できるようにするために、このコードを使用または変更するには何が必要ですか?現在、応答は次のとおりです。
{
"odata.error":{
"code":"Authentication_MissingOrMalformed",
"message":{
"lang":"en",
"value":"Access Token missing or malformed."
},
"values":null
}
}
私はこれを理解しようと最後の2日間を費やし、ようやくそれを得ました。 Azure ADは移動するターゲットであり、ASPNETCOREがまだ成熟しているため、Azure ADグラフへのアクセス方法に関するほとんどのドキュメントは古くなっています。つまり、現時点では、これがAzure ADグラフにアクセスする方法です。
次に、上記の情報を使用してアクセストークンを生成し、そのトークンを使用してグラフを呼び出します。
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();
}
私が遭遇し、いくつかのフォーラムが議論していることがわかるかもしれないもう1つの大きな問題は、Authorization_Request_DeniedエラーまたはInsufficient_Permissionsエラーが発生するかどうかです。この問題は、PowerShellコマンドを実行して、Azure ADの「管理者」権限で登録したアプリケーションに付与することで解決されます。 MS Graph APIへのリクエストで「承認リクエストが拒否されました-操作を完了するには権限が不十分です」
実行したいPowershellコマンドは
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
うまくいけば、これが役立ちます。精製が必要だと思われる場合はお知らせください。
グラフクライアントを使用すると、コードがはるかに簡単になります。
var serviceRoot = new Uri(@"https://graph.windows.net/"+ tenantID);
var activeDirectoryClient = new ActiveDirectoryClient(serviceRoot,
() => Task.FromResult(authenticationResult.AccessToken));
// Fetch more user details from the Graph
var user = await activeDirectoryClient.Users.GetByObjectId(userObjectID).ExecuteAsync();
// fetch all groups (DG + SG) and roles transitively for the user
var userGroups = await user.GetMemberObjectsAsync(securityEnabledOnly: false);