我试图通过以下文章使用Azure Active Directory验证Xamarin Android应用程序: https://blog.xamarin.com/authenticate-xamarin-mobile-apps-using-azure-active-directory/
我已经在AAD注册了一个原生应用程序;请注意,除了创建它之外,我没有给它任何额外的权限。
然后我使用以下代码通过AAD验证APP
button.Click += async (sender, args) =>
{
var authContext = new AuthenticationContext(commonAuthority);
if (authContext.TokenCache.Count > 0)
authContext = new AuthenticationContext(authContext.TokenCache.ReadItems().GetEnumerator().Current.Authority);
authResult = await authContext.AcquireTokenAsync(graphResourceUri, clientId, returnUri, new PlatformParameters(this));
SetContentView(Resource.Layout.Main);
doGET("https://management.azure.com/subscriptions/{subscription-id}/resourceGroups/OPSLABRG/providers/Microsoft.Compute/virtualMachines/LABVM?api-version=2015-08-01", authResult.AccessToken);
};
private string doGET(string URI, String token)
{
Uri uri = new Uri(String.Format(URI));
// Create the request
var httpWebRequest = (HttpWebRequest)WebRequest.Create(uri);
httpWebRequest.Headers.Add(HttpRequestHeader.Authorization, "Bearer " + token);
httpWebRequest.ContentType = "application/json";
httpWebRequest.Method = "GET";
// Get the response
HttpWebResponse httpResponse = null;
try
{
httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
}
catch (Exception ex)
{
Toast.MakeText(this, "Error from : " + uri + ": " + ex.Message, ToastLength.Long).Show();
return null;
}
}
这似乎是在使用Work帐户时获取令牌。 使用有效的Hotmail帐户会收到错误收到错误请求。
然而,主要问题是当我尝试使用REST检索VM详细信息时。 即使使用Work帐户,REST GET方法也会因401 Unauthorized错误而失败。
我不确定代码是否缺少某些内容,或者我是否需要为该应用程序提供一些额外的权限。这需要能够支持从其他租户验证用户以获取VM详细信息。
感谢任何指导。
答案 0 :(得分:1)
请注意,除了创建之外,我没有给它任何额外的权限 它
这是问题所在。
为了调用Azure Management API https://management.azure.com/
,您必须先注册您的应用程序才能拥有调用此API的权限。
仅在此时,您的应用程序是否有权拨打ARM电话,您的电话应该开始工作。
答案 1 :(得分:1)
根据你的描述,我在我这边检查了这个问题。正如Shawn Tabrizi所说,您需要为访问ARM Rest API分配委派权限。这是我的代码片段,您可以参考它:
var context = new AuthenticationContext($"https://login.windows.net/{tenantId}");
result = await context.AcquireTokenAsync(
"https://management.azure.com/"
, clientId, new Uri("{redirectUrl}"), platformParameter);
我建议您使用Fiddler或Postman来模拟针对ARM的access_token
请求来缩小此问题。如果有任何错误,您可以检查详细的响应以解决原因。
以下是我检索Azure VM基本信息的测试:
此外,您可以利用jwt.io解码access_token
并检查相关属性(例如aud
,iss
等),如下所示,以缩小此问题。