2017-04-19 18 views
0

這個問題直接跟在this one之後。 我有一個本地應用程序,必須顯示用戶所屬的組(更確切地說,我想顯示與該組關聯的SharePoint站點)。如何觸發原生多租戶應用程序的管理員同意流程?

它適用於該應用程序註冊的租戶的任何用戶。但是當我嘗試從另一個租戶進行連接時,它只能與管理員帳戶一起使用。試圖與用戶帳戶連接給了我這個錯誤:

相關ID:XXXXXXXX-XXXXXXXX-XXXX-XXXXXXXXXXX

時間戳:2017年4月19日08:32:24Z

AADSTS90093:由於缺少權限,調用委託人不能同意。

從不觸發管理員同意流程。正如我在以前的帖子說上面鏈接,嘗試添加「提示= admin_consent」作爲查詢參數返回此錯誤:

「重複的查詢參數‘提示’中extraQueryParameters」

樣品和到目前爲止,我已經找到的教程都旨在向Web應用程序,並且可幫助我的計算器上的問題是格外安靜,一旦這個問題mentionned link1link2


是否有甚至觸發本機應用程序管理員同意流量的方法嗎?它可以使用ADAL或其他方式完成嗎?

將應用程序從本機更改爲網站不是一種選擇,因爲我只是試圖向現有應用程序添加新功能。
因此,如果上述問題的答案是'不',是否有任何解決方法?我願意接受任何建議。

回答

2

您可以在不使用ADAL的情況下發送管理員同意reuquest。由於您使用的WinForm的應用程序,我們可以使用WebBrowser控件來顯示登錄頁面,設置prompt=admin_consent爲請求的URL。如果管理員同意,成功的一部分,檢查響應的admin_consent值是否True。下面的代碼是供你參考:

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 

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 
      } 

     } 
    } 

如果你不想做任何代碼,租戶管理員可以手動打開瀏覽器,並前往以下網址做管理員同意

+0

謝謝。兩者似乎都很好。我不知道我會選擇哪種解決方案,但是這個問題已經解決了。 – Patsuan

相關問題