使用Azure Active Directory验证Xamarin Android应用程序失败,401未授权

时间:2017-08-07 09:38:49

标签: xamarin xamarin.android azure-active-directory

我试图通过以下文章使用Azure Active Directory验证Xamarin Android应用程序: https://blog.xamarin.com/authenticate-xamarin-mobile-apps-using-azure-active-directory/

  1. 我已经在AAD注册了一个原生应用程序;请注意,除了创建它之外,我没有给它任何额外的权限。

  2. 然后我使用以下代码通过AAD验证APP

  3. 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详细信息。

    感谢任何指导。

2 个答案:

答案 0 :(得分:1)

  

请注意,除了创建之外,我没有给它任何额外的权限   它

这是问题所在。

为了调用Azure Management API https://management.azure.com/,您必须先注册您的应用程序才能拥有调用此API的权限。

您可以将此作为应用注册的一部分,如下所示: enter image description here

仅在此时,您的应用程序是否有权拨打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基本信息的测试:

enter image description here

此外,您可以利用jwt.io解码access_token并检查相关属性(例如audiss等),如下所示,以缩小此问题。

enter image description here