2017-07-21 15 views
1

クライアントのシークレットとリダイレクトURLを持つWebAppタイプのAzure AADアプリケーションを作成しました。今、私はAADアプリケーションを使用しているユーザーに代わってアクセストークンを取得したいと思います。ドキュメントを見て、私はこれまでに次のコードを手に入れました。ADALを使用して.NETでOn-Behalf-Of-Userトークンを取得する方法

static void Main(string[] args) 
    { 
     var clientId = "<REDACTED>"; 
     var clientSecret = "<REDACTED>"; 
     var resourceAppIdURI = "https://api.office.com/discovery/"; 
     var authority = "https://login.microsoftonline.com/common"; 

     AuthenticationContext ac = new AuthenticationContext(authority, new FileCache()); 
     ClientCredential cc = new ClientCredential(clientId, clientSecret); 

     // Get token as application 
     var task = ac.AcquireTokenAsync(resourceAppIdURI, cc); 
     task.Wait(); 
     var appToken = task.Result.AccessToken; 

     // Get tokenn on behalf of user 
     UserCredential uc = new UserCredential("[email protected]"); 
     task = ac.AcquireTokenAsync(resourceAppIdURI, clientId, uc); 
     var userToken = task.Result.AccessToken; 

     Console.ReadLine(); 
    } 

しかし、これは私がユーザートークンを取得しようとすると次のようなエラーが発生します。

メッセージ「AADSTS70002:リクエストボディには、次の パラメータ含まれている必要があります。 'client_secretまたはclient_assertionを' \ rを\ nTrace ID: 0e977f67-d5cb-4cf5-8fea-bac04b6d0400の\ rを\ nCorrelation ID: 824a96bf -8007-4879-970c-2680644b8669 \ rを\ nTimestamp:2017年7月21日 05:02:41Z」という文字列

なぜ私はこのエラーを取得し、どのようにそれを修正するのですか? 最初にユーザーとログインし、代わりにUserAssertionを使用する必要がありますか? AcquireTokenAsyncメソッドのオーバーロードされたメソッドはたくさんありますが、何を使用すべきかはわかりません。

は、私はまた、彼らはこれがトークンとしてログインしているユーザーを取得するために、関連するコードであること https://github.com/Azure-Samples/active-directory-dotnet-webapi-onbehalfof/blob/8afb3e6a648d8e7246685bf6747d009006c761b8/TodoListService/Controllers/TodoListController.cs

を行っている。ここ

ClientCredential clientCred = new ClientCredential(clientId, appKey); 
    var bootstrapContext = ClaimsPrincipal.Current.Identities.First().BootstrapContext as System.IdentityModel.Tokens.BootstrapContext; 
    string userName = ClaimsPrincipal.Current.FindFirst(ClaimTypes.Upn) != null ? ClaimsPrincipal.Current.FindFirst(ClaimTypes.Upn).Value : ClaimsPrincipal.Current.FindFirst(ClaimTypes.Email).Value; 
    string userAccessToken = bootstrapContext.Token; 
    UserAssertion userAssertion = new UserAssertion(bootstrapContext.Token, "urn:ietf:params:oauth:grant-type:jwt-bearer", userName); 

    string authority = String.Format(CultureInfo.InvariantCulture, aadInstance, tenant); 
    string userId = ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier).Value; 
    AuthenticationContext authContext = new AuthenticationContext(authority, new DbTokenCache(userId)); 

彼らはすでにログインしているかを確認するには、このgithubのURLを見てそのログインしたユーザーのトークンからUserAssertionを作成します。私のコンソールアプリケーションでは、ユーザーはまだログインしていません。 だから私は私のコンソールアプリでこれを行う方法が必要です。ユーザーにAADログインページをポップアップとして表示するには、ユーザーがクレジットを入力するとその情報を使用してUserAssertionオブジェクトを作成します。

おかげ

答えて

1

あなたのシナリオでは、ユーザーに代わってウェブAPIを呼び出すネイティブアプリケーションです。 enter image description here

についての詳細をお読みください:OAuth 2.0 authorization code grantを使用して、ユーザーのアクセストークンを取得できたネイティブアプリケーションは、その後、アクセストークンは、所望のリソースをユーザーに許可して返すWeb APIへのリクエストで送信されますプロトコルフローhereの説明。ネイティブアプリケーションからWeb APIシナリオの場合はcode samplesを参照してください。

また、ネイティブクライアント(.netコンソールアプリケーション)からAzure AD Graph APIを呼び出す方法についてのコードサンプルについては、hereをクリックし、認証にActive Directory認証ライブラリ(ADAL)を使用します。

+0

私は実際には、ユーザートークンの代わりに他のaadアプリケーション(ネイティブクライアント)を使用したくありません。私がpostman appを使用してアクセストークンを取得しようとすると、webapp aadアプリケーションの資格情報を提供すると、それはユーザートークンの代わりになります。だから私は私のコンソールアプリで同じことをすることができますか? – user330612

+0

あなたの要件がコンソールアプリケーションにある場合は、ポップアップとしてユーザーにAADログインページを表示し、ユーザーの代わりにアクセストークンを取得し、AADにネイティブアプリを登録する必要があります。あなたのシナリオは何ですか?私は見る。 –

+0

コンソールアプリケーションの代わりにpowershellを使用すると、同じWebアプリケーションの資格情報を使用して、ポップアップを表示しているユーザーとログインすることができますか、それともネイティブアプリが必要ですか。私のシナリオでは、1つのWebアプリケーションしか作成されていないため、より多くのアプリケーションを作成するためのアクセス権がなく、ユーザーアクセストークンの代わりに使用する必要のあるapiをテストしたいと考えています。それは私が1つのwebappを持っているだけ与えられたAPIの応答をテストするために使用することができる他のものを私に教えてください。 – user330612

関連する問題