web-dev-qa-db-ja.com

コンソールアプリケーションからMicrosoftGraphを呼び出す方法c#

Azure ADでユーザーを作成するには、Microsoft GraphAPIを呼び出す必要があります。

最初にコンソールアプリケーションからテストし、次にAzure関数に実装する必要があります。

https://developer.Microsoft.com/en-us/graph/graph-Explorer

Microsoft Graph APIを初めて使用します。c#コンソールアプリケーションからAPIに接続して実行するにはどうすればよいですか。

私はすでにアプリケーションをAADに登録しています。

私はトークンを次のように取得しようとしています:

string resourceId = "https://graph.Microsoft.com";
string tenantId = "<tenantID>";
string authString = "https://login.microsoftonline.com/" + tenantId;
string upn = String.Empty;
string clientId = "<ClientID>";
string clientSecret = "<clientSecret>";
//string clientSecret = ConfigurationManager.AppSettings["clientSecret"];


log.Verbose("ClientSecret=" + clientSecret);
log.Verbose("authString=" + authString);

var authenticationContext = new AuthenticationContext(authString, false);

// Config for OAuth client credentials 
ClientCredential clientCred = new ClientCredential(clientId, clientSecret);
AuthenticationResult authenticationResult = await authenticationContext.AcquireTokenAsync(resourceId,clientCred);
string token = authenticationResult.AccessToken;
log.Verbose("token=" + token);

既存のAADB2Cを使おうとしています。 b2c-extensions-app。変更しないでください。 AADB2Cがユーザーデータを保存するために使用します。

私は次のように許可を有効にしました: enter image description here

例外も取得もアクセストークンも取得せず、プログラムはサイレントに終了します

また:

新しい図書館があります

 <package id="Microsoft.Identity.Client" version="1.1.0-preview" targetFramework="net46" />

次のログインポップアップなしで直接ログインしてトークンを取得するにはどうすればよいですか? PublicClientApplication

5

コンソールアプリから接続するには、最初に有効なトークンを取得する必要があります。 UIがないので、 ユーザーなしでアクセスを取得する を実行する必要があります。 このタイプの「アプリのみ」のトークンは、使用する前に 管理者の同意 が必要であることに注意してください。

Create User シナリオをサポートするには、 permission scopes include ser.ReadWrite.All であることを確認する必要があります。

有効なトークンを取得したら、GraphAPIを呼び出すことができます。グラフはREST APIであるため、すべての呼び出しは、承認ヘッダー内で渡されたトークンを使用してHTTP経由で行われます。

一般的な概要は Microsoft GraphとRESTの使用を開始する で読むことができます。利用可能な言語/フレームワーク固有の概要もいくつかありますが、それらはすべて、UIがあることを前提としています(つまり、単なるコンソールではありません)。一般的に言って、ユーザーを作成するためのコンソールツールを探している場合は、 PowerShell を使用することをお勧めします。

8
Marc LaFleur

管理者の同意が付与されたAzureADアプリケーションが既にあることを前提としています。

コンソールアプリから接続するには、最初に有効なトークンを取得する必要があります。 UIがないため、ユーザーなしでアクセスできるようにする必要があります。このタイプの「アプリのみ」のトークンは、使用する前に管理者の同意が必要であることに注意してください。

次に、2つのNuGet依存関係をdotnetプロジェクトに追加する必要があります

<PackageReference Include="Microsoft.Graph" Version="1.15.0" />
<PackageReference Include="Microsoft.Identity.Client" Version="4.0.0" />

Microsoft.Identity.Client AzureADを使用した認証用およびMicrosoft.GraphMSグラフクエリを実行します。

var tenantId = "you-Azure-tenand-id";
var clientId = "Azure-ad-application-id";
var clientSecret = "unique-secret-generated-for-this-console-app";

// Configure app builder
var authority = $"https://login.microsoftonline.com/{tenantId}";
var app = ConfidentialClientApplicationBuilder
    .Create(clientId)
    .WithClientSecret(clientSecret)
    .WithAuthority(new Uri(authority))
    .Build(); 

// Acquire tokens for Graph API
var scopes = new[] {"https://graph.Microsoft.com/.default"};
var authenticationResult = await app.AcquireTokenForClient(scopes).ExecuteAsync();

// Create GraphClient and attach auth header to all request (acquired on previous step)
var graphClient = new GraphServiceClient(
    new DelegateAuthenticationProvider(requestMessage => {
        requestMessage.Headers.Authorization = 
            new AuthenticationHeaderValue("bearer", authenticationResult.AccessToken);

        return Task.FromResult(0);
    }));

// Call Graph API
var user = await graphClient.Users["[email protected]"].Request().GetAsync()

更新2020.01

新しいパッケージがありますMicrosoft.Graph.Auth認証とトークン管理を簡素化します。

今回はベータAPIを使用したいとします。

<PackageReference Include="Microsoft.Graph.Auth" Version="1.0.0-preview.2" />
<PackageReference Include="Microsoft.Graph.Beta" Version="0.12.0-preview" />
var tenantId = "you-Azure-tenand-id";
var clientId = "Azure-ad-application-id";
var clientSecret = "unique-secret-generated-for-this-console-app";

// Configure application
var clientApplication = ConfidentialClientApplicationBuilder
    .Create(clientId)
    .WithTenantId(tenantId)
    .WithClientSecret(clientSecret)
    .Build();

// Create ClientCredentialProvider that will manage auth token for you
var authenticationProvider = new ClientCredentialProvider(clientApplication);
var graphClient = new GraphServiceClient(authenticationProvider);

// Call Graph API
var user = await graphClient.Users["[email protected]"].Request().GetAsync()
5
Sergey Tihon

この MSALコンソールアプリチュートリアル は、.NETコンソールアプリでMSAL(Microsoft認証ライブラリ)を使用してトークンを取得する方法について説明しています。

Microsoft Graph呼び出しを行うために、RunAsync()関数をこれに置き換えました。これは、取得したトークンをGraphServiceClientを使用して要求に添付します。

static async Task RunAsync()
    {
        const string clientId = "your client id";
        string[] scopes = { "User.Read" };
        AuthenticationResult result;

        var clientApp = new PublicClientApplication(clientId);
        try
        {
            result = await clientApp.AcquireTokenAsync(scopes.Split(new char[] { ' ' }));
            Console.WriteLine(result.AccessToken);
            GraphServiceClient graphClient = new GraphServiceClient(
                new DelegateAuthenticationProvider(
                    async (requestMessage) =>
                    {
                        // Append the access token to the request.
                        requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", result.AccessToken);

                        // Some identifying header
                        requestMessage.Headers.Add("SampleID", "aspnet-connect-sample");
                    }));

            // Get a page of mail from the inbox
            var inboxMail = await graphClient.Me.MailFolders.Inbox.Messages.Request().GetAsync();
            foreach(var mail in inboxMail.CurrentPage.ToList())
            {
                Console.Write("From: {0}\nSubject: {1}\nBody:\n{2}\n--------------------\n", mail.From.EmailAddress.Address, mail.Subject, mail.BodyPreview);
            }
        }

        // Unable to retrieve the access token silently.
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
    }
1

この質問はかなり古いものですが、最初に同じことをする必要があったときに最初に出てきた質問の1つでした。以下に、それを実現するために使用した手順とリソースを示します。

  1. 私はO365テナントを使用しました(office.comから入手できます。1年間の開発者トライアルを入手できることに注意してください)。テナントを取得したら、テナント管理ユーザーとしてログインすると、Azureポータルにもアクセスできます。 Azure Portalで、Active Directory /プロパティに移動してテナントIDを確認します。
  2. ここの手順に従いました https://docs.Microsoft.com/en-us/Azure/active-directory/develop/quickstart-v2-netcore-daemon 新しい登録済みアプリケーションを作成しました。新しいシークレットを作成し、値をコピーしました(コンソールアプリではクライアントシークレットになります)。登録されたアプリケーションIDは、コンソールアプリのクライアントIDになります。
  3. 上記のリンクでgithubリポジトリのクローンを作成し、appsettingsの値を上記の手順で説明したテナントID、クライアントID、クライアントシークレットに変更しました。
  4. そのリポジトリのコードには、.NETCore2.1以降ConfigurationBuilderに存在しなくなったメソッドがいくつか呼び出されています。私はこれらの行を置き換えました(おそらくより良い/より短い方法があります):

    authenticationConfig.Tenant = Configuration.GetSection( "Tenant")。Value.ToString(); authenticationConfig.ClientId = Configuration.GetSection( "ClientId")。Value.ToString(); authenticationConfig.ClientSecret = Configuration.GetSection( "ClientSecret")。Value.ToString();

  5. これで、テナント内のユーザーを反復処理する必要があります。グラフエクスプローラー( https://developer.Microsoft.com/en-us/graph/graph-Explorer )に移動して、さらにURLを見つけることができます(Program.csで行を見つけてそれらを置き換えます) )。私の知る限り、APIのv2.0は「ベータ」です(「ベータ」を「v1.0」の場所に置いてください。間違っている場合は誰かが訂正してください)。

    apiCaller.CallWebApiAndProcessResultASync( " https://graph.Microsoft.com/v1.0/users "、result.AccessToken、Display);を待ちます。

1
JakeJ

注意

Azure AD B2Cディレクトリ内のユーザーを管理するには、Azure AD GraphAPIを使用する必要があります。これは、Microsoft GraphAPIとは異なります。詳細 ここ

かなり良いサンプルプロジェクト@GitHubがあります: AzureADQuickStarts/B2C-GraphAPI-DotNet そしてそれに付随するドキュメント ここ

0