web-dev-qa-db-ja.com

asp.netコアプロジェクトでのAzure Active Directoryグループの取得

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
   }
}
35
Kiran

私はこれを理解しようと最後の2日間を費やし、ようやくそれを得ました。 Azure ADは移動するターゲットであり、ASPNETCOREがまだ成熟しているため、Azure ADグラフへのアクセス方法に関するほとんどのドキュメントは古くなっています。つまり、現時点では、これがAzure ADグラフにアクセスする方法です。

  1. アプリのclientidをメモします
  2. アプリをAzure Active Directoryに登録する
  3. その登録でキーを生成し、それをメモします(作成した直後にのみ表示できます)
  4. 「テナント名」をメモします(テナントIDを使用することもできます)

次に、上記の情報を使用してアクセストークンを生成し、そのトークンを使用してグラフを呼び出します。

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

うまくいけば、これが役立ちます。精製が必要だと思われる場合はお知らせください。

1

グラフクライアントを使用すると、コードがはるかに簡単になります。

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);
0
zendu