如何触发本机多租户应用程序的管理员同意流程?
How can I trigger admin consent flow for a native multitenant app?
这个问题直接跟在 之后。
我有一个本机应用程序,它必须显示用户所属的组(更准确地说,我想显示与该组关联的共享点网站)。
它适用于注册该应用程序的租户的任何用户。但是当我尝试从另一个租户连接时,它只适用于管理员帐户。尝试连接用户帐户时出现此错误:
Correlation ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx
Timestamp: 2017-04-19 08:32:24Z
AADSTS90093: Calling principal cannot consent due to lack of permissions.
永远不会触发管理员同意流程。正如我之前在上面链接的 post 中所述,尝试添加“prompt=admin_consent”作为查询参数 returns 此错误:
"Duplicate query parameter 'prompt' in extraQueryParameters"
到目前为止我发现的示例和教程都是针对网络应用程序的,一旦提到这个问题,本可以在 Whosebug 上帮助我的问题就奇怪地沉默了 link1 link2。
有没有办法触发本机应用程序的管理员同意流程?可以使用 ADAL 或其他方式完成吗?
将应用程序从本机更改为 Web 不是一种选择,因为我只是想向现有应用程序添加新功能。
因此,如果上述问题的答案是 'no',是否有任何解决方法? 我愿意接受任何建议。
您可以在不使用 ADAL 的情况下发送管理员同意请求。由于您使用的是 WinForm 应用程序,我们可以使用 WebBrowser 控件显示登录页面,将 prompt=admin_consent
设置为请求 url 的一部分。如果管理员同意成功,请检查 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
这个问题直接跟在
它适用于注册该应用程序的租户的任何用户。但是当我尝试从另一个租户连接时,它只适用于管理员帐户。尝试连接用户帐户时出现此错误:
Correlation ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx
Timestamp: 2017-04-19 08:32:24Z
AADSTS90093: Calling principal cannot consent due to lack of permissions.
永远不会触发管理员同意流程。正如我之前在上面链接的 post 中所述,尝试添加“prompt=admin_consent”作为查询参数 returns 此错误:
"Duplicate query parameter 'prompt' in extraQueryParameters"
到目前为止我发现的示例和教程都是针对网络应用程序的,一旦提到这个问题,本可以在 Whosebug 上帮助我的问题就奇怪地沉默了 link1 link2。
有没有办法触发本机应用程序的管理员同意流程?可以使用 ADAL 或其他方式完成吗?
将应用程序从本机更改为 Web 不是一种选择,因为我只是想向现有应用程序添加新功能。
因此,如果上述问题的答案是 'no',是否有任何解决方法? 我愿意接受任何建议。
您可以在不使用 ADAL 的情况下发送管理员同意请求。由于您使用的是 WinForm 应用程序,我们可以使用 WebBrowser 控件显示登录页面,将 prompt=admin_consent
设置为请求 url 的一部分。如果管理员同意成功,请检查 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