2017-04-19 7 views
0

この質問は直接this oneの後に続きます。 私は、ユーザーが所属するグループを表示する必要があるネイティブアプリを持っています(より正確には、グループに関連付けられた共有サイトを表示したい)。ネイティブマルチテナントアプリの管理者同意フローを開始するにはどうすればよいですか?

これは、アプリが登録されているテナントのどのユーザーでもうまく機能します。しかし、私が別のテナントから接続しようとすると、管理者アカウントでしか動作しません。ユーザーアカウントに接続しようとすると私は、このエラーを与える:

相関ID:XXXXXXXX-XXXXXXXX-XXXX-xxxxxxxxxxx

タイムスタンプ:2017年4月19日08:32:24Z

AADSTS90093:プリンシパルにアクセス権がないために同意できません。

管理者同意フローは実行されません。上記のリンク私の以前の記事で述べたように、クエリパラメータとして「プロンプト= admin_consent」を追加しようとすると、このエラーが返されます。

「重複クエリパラメータextraQueryParametersの 『プロンプト』」

サンプルと私が今までに見つけたチュートリアルはすべて、ウェブアプリケーションを目指していました。この問題が一度言及されると、stackoverflowで私を助けたかもしれない質問は、奇妙に静かです。link1link2ネイティブアプリのための管理者の同意の流れをトリガするにも方法は


ありますか?それはADALか別の方法で行うことができますか?

既存のアプリに新しい機能を追加しようとしているため、アプリをネイティブからウェブに変更することはできません。
上記の質問に対する回答が「いいえ」の場合は、がありますか?私は何か提案があります。

答えて

2

ADALを使用せずに管理者同意書の再発行を送信することができます。 WinFormアプリケーションを使用しているため、Webブラウザーコントロールを使用してログインページを表示し、リクエストURLの一部としてprompt=admin_consentを設定することができます。成功した場合、admin_consentの値がTrueであるかどうかを確認します。以下のコードは、あなたの参考のためにある:

public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 

     var parameters = new Dictionary<string, string> 
      { 
       { "response_type", "code" }, 
       { "client_id", "<client id>" }, 
       { "redirect_uri", "http://localhost" }, 
       { "prompt", "admin_consent"} 
      }; 
     var requestUrl = string.Format("{0}/authorize?{1}", "https://login.microsoftonline.com/common/oauth2", BuildQueryString(parameters)); 
     webBrowser1.Navigate(requestUrl); 
    } 
    protected string EndPointUrl 
    { 
     get 
     { 
      return string.Format("{0}/{1}", "https://login.microsoftonline.com/common", ""); 
     } 
    } 

    private string BuildQueryString(IDictionary<string, string> parameters) 
    { 
     var list = new List<string>(); 

     foreach (var parameter in parameters) 
     { 
      list.Add(string.Format("{0}={1}", parameter.Key, Uri.EscapeDataString(parameter.Value))); 
     } 

     return string.Join("&", list); 
    } 

    private void webBrowser1_Navigated(object sender, WebBrowserNavigatedEventArgs e) 
    { 
     if (e.Url.AbsoluteUri.StartsWith("http://localhost")) 
     { 
      var collection = System.Web.HttpUtility.ParseQueryString(e.Url.Query); 
      //check whether admin consent success 
      if (collection["admin_consent"] == "True") 
      { 
       //hide/close webBrowser 
      } 

     } 
    } 

あなたがコードで何かをしたくない場合は、テナント管理者はブラウザを開いて、次のURLに移動して、手動で管理者の承諾を行うことができます:

https://login.microsoftonline.com/<tenant>/oauth2/authorize?client_id=<client id>&response_type=code&redirect_uri=http%3A%2F%2Flocalhost%2F&nonce=1234&resource=https%3A%2F%2Fgraph.windows.net%2F&prompt=admin_consent 
+0

ありがとうございます。両方とも正常に動作するようです。私はまだ解決策を選ぶつもりはないが、この問題は解決される。 – Patsuan

関連する問題