如何触发本机多租户应用程序的管理员同意流程?

时间:2017-04-19 09:01:34

标签: .net azure multi-tenant adal

这个问题紧跟在this one之后。 我有一个本机应用程序必须显示用户所属的组(更准确地说,我想显示与该组关联的sharepoint站点)。

适用于该应用注册的租户的任何用户。但是当我尝试从另一个租户连接时,它只适用于管理员帐户。尝试连接用户帐户会出现此错误:

  

相关ID:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx

     

时间戳:2017-04-19 08:32:24Z

     

AADSTS90093:由于缺少权限,主叫方无法同意。

永远不会触发管理员同意流程。正如我在上面链接的上一篇文章中所述,尝试添加" prompt = admin_consent"作为查询参数返回此错误:

  

"重复查询参数'提示'在extraQueryParameters"

我到目前为止找到的示例和教程都是针对网络应用程序的,一旦提到这个问题link1 link2,那些可能帮助我进行stackoverflow的问题就会异常沉默。

是否有办法触发本机应用的管理员同意流?是否可以使用ADAL或其他方式完成?

将应用从原生更改为网页不是一种选择,因为我只是尝试向现有应用添加新功能。
因此,如果对上述问题的回答是“没有”,是否有任何解决方法?我可以接受任何建议。

1 个答案:

答案 0 :(得分:2)

您可以在不使用ADAL的情况下发送管理员同意请求。由于您使用的是WinForm应用程序,我们可以使用WebBrowser控件来显示登录页面,将prompt=admin_consent设置为请求URL的一部分。如果管理员同意成功,请检查响应中admin_consent的值是否为{{ 1}}。以下代码供您参考:

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
            }

        }
    }