0

私は、当社の全従業員の電子メールアドレスのリストを作成しようとしています。 これはAzureで実行中のWebアプリケーションで、Azure AD認証を使用しています。アプリは.NET Framework 4.6を使用し、Microsoft.Owin.Securityパッケージを使用してAzure ADに接続します。アクセス権が制限されたAzure ADから基本的なUserInfoのみを照会してください

私は認証することができますが、私はアプリの登録で定義された私の役割によって許可されています。ここまでは順調ですね。 自分のユーザープロフィールをチェックアウトできます。これは、Microsoft.Azure.ActiveDirectory.GraphClientパッケージを使用して、HTTPRequestsを手動で作成するのではなく、クエリを作成します。

string userObjectID = ClaimsPrincipal.Current 
    .FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value; 

ActiveDirectoryClient activeDirectoryClient = new ActiveDirectoryClient(serviceRoot, 
    async() => await authorizationHelper.GetTokenForApplication()); 

var result = await activeDirectoryClient.Users 
    .Where(u => u.ObjectId.Equals(userObjectID)) 
    .ExecuteAsync(); 

IUser user = result.CurrentPage.ToList().First(); 

ADは、私のクエリを計算し、それは私だけを返すことを見て、私は自分の情報を表示させて頂くことを推論します。実行は成功し、私だけを返します。別のページで

、私は次のことを試してください(など、ユーザーがタグに先行入力し、existanceをチェックする)会社で使用されるメールアドレスを表示したい:

result = await activeDirectoryClient.Users 
    .ExecuteAsync(); 
return result.CurrentPage 
    .ToList(); 

この失敗する、 "不十分な権限"。私は推測するユーザー全体を表示することは許可されていません。私の委任権限はmeaning、「すべてのユーザーの基本的なプロフィールを読む」になっている:

はアプリがログインしているユーザーに代わって 組織内のすべてのユーザーの基本的なプロフィールを読み取ることができます。次のプロパティ は、ユーザーの基本プロファイル(表示名、姓名、 写真、電子メールアドレス)で構成されています。

だから、私はフィルタリングしよう:

result = await activeDirectoryClient.Users 
    .Where(u => u.Mail.StartsWith(str)) 
    .ExecuteAsync(); 
return result.CurrentPage 
    .ToList(); 

が、それはまだ私に全体のユーザーを与える、と私はまだ、再び「不十分な権限」でヒットしています。だから私は

GenericArguments[1], System.String, Microsoft.Azure.ActiveDirectory.GraphClient.Extensions 
.ReadOnlyQueryableSet.`2[TSource,TISource] conflicts with type TISource. 

(オランダ語から意訳)不可解なランタイムエラーを与える

result = await activeDirectoryClient.Users 
    .Where(u => u.Mail.StartsWith(str)) 
    .Select (u => u.Mail) 
    .ExecuteAsync(); 
return result.CurrentPage 
    .ToList(); 

を試してみて、私は途方に暮れています。 ActiveDirectoryClientと通常のグラフAPIで利用できるソースコードはありませんdoesn't even mention selecting only basic info.

「簡単な」ソリューションは、「もっと多くのアプリのアクセス許可を取得する」ことですが、それは官僚制を通過するには多くの時間が必要です。そして、私はすべてのユーザーのメールを取得することができますか?

+1

'GetTokenForApplication'関数を表示してください。 [online tool](https://jwt.io/)を使用してアクセストークンを解読し、 'scp'claimのパーミッションを確認してください。 –

+0

非常に便利ですが、私は現地作業版とwebapp版から得たトークンを比較できるようになりました。私はパーミッションが不足していた、ボックスはチェックされたがパーミッションは決して与えられなかった*。一口。 – Wolfzoon

答えて

0

まず、「制限付きのアクセス権を持つAzure ADから基本的なUserInfoのみをクエリする」に特別な操作は必要ありません。ユーザーにクエリを実行するだけで、アクセスできないフィールドはすべてnullとして初期化されます。 Insufficient privilegesは、ユーザーをまったく見ることができないことを意味します。赤旗。

最初は私のトークンカードが間違っていると思いました。それはどれだったのですか?それから私はそれを修正した。まだエラーがあります。

Nan Yuによってリンクされているonline toolでさまざまなアプリケーションでいくつかのトークンを調べると、自分のトークンでユーザーの基本プロファイルを見るための実際のアクセス許可が不足していることが分かりました。 私は依然としてトークンのパーミッションを取得しておらず、 "委任されたパーミッション"のチェックボックスにチェックが入っていても、 "パーミッションの付与"オプションはその後にはうまく使用されませんでした。

PSA:すべてのチェックボックスが実際に付与されていると仮定しないでください。 Appサービスにどのアクセス許可があるかをチェックインします。それがあなたの会社によって許されているなら、それはそうです。

関連する問題