MSAL,Azure MobileService和Auto REST调用获得401 Unauthorized

时间:2017-04-18 03:15:28

标签: rest azure authentication msal autorest

我有一个应用程序(目前在UWP中),它将MobileServiceClient和AutoRest用于Azure App Service API应用程序。我成功使用了winfbsdk并可以通过它进行身份验证,然后使用FB访问令牌作为JObject登录到MobileService.LoginAsync。当我在应用程序中通过AutoRest调用API应用程序时,我也会使用该JObject并将其发送到x-zumo-auth标头中。 我想要做的是能够使用MicrosoftAccount进行身份验证。如果我使用MobileService.LoginAsync,我无法获得正确的令牌并将其传递给AutoRest - 它总是以401 Unauthorized的形式返回。 我试图使用MSAL,但它返回一个Bearer令牌,并且传递它也会返回401 Unauthorized。 有什么好办法吗?我从MSAL的路线开始,因为这将支持Windows桌面,UWP和Xamarin Forms,这将是理想的。我只需要有关如何从中获取正确令牌以传递给返回Azure App Service API应用程序的AutoRest HttpClient的信息。

更新的 如果我使用以下流程,它适用于Facebook,但不适用于MicrosoftAccount。

-Azure AppService with WebAPI(以及通过浏览器进行测试的swagger)
- 通过服务上的Azure仪表板进行安全设置并配置为允许Facebook或MicrosoftAccount

1.在我的UWP应用程序上,使用winfbsdk,我使用Facebook登录,然后获取FBSession.AccessTokenData.AccessToken并将其插入到JObject中:

  JObject token = JObject.FromObject
  (new{access_token = fbSession.AccessTokenData.AccessToken});

2。登录MobileServiceClient

  user = await App.MobileService.LoginAsync
  (MobileServiceAuthenticationProvider.Facebook, token);
  1. 使用HttpClient登录API App并检索要在X-ZUMO-AUTH中使用的令牌

    using (var client = new HttpClient())
    {
        client.BaseAddress = App.MobileService.MobileAppUri; 
            var jsonToPost = token;
    
            var contentToPost = new StringContent(
             JsonConvert.SerializeObject(jsonToPost),
             Encoding.UTF8, "application/json");
            var asyncResult = await client.PostAsync(
            "/.auth/login/" + provider.ToString(),
            contentToPost);
    
            if (asyncResult.Content == null)
            {
                throw new InvalidOperationException("Result from call was null.");
                return false;
            }
            else
            {
                if (asyncResult.StatusCode == System.Net.HttpStatusCode.OK)
                {
                    var resultContentAsString = asyncResult.Content.AsString();
    
                    var converter = new ExpandoObjectConverter();
                    dynamic responseContentAsObject = JsonConvert.DeserializeObject<ExpandoObject>(
                    resultContentAsString, converter);
    
                    var applicationToken = responseContentAsObject.authenticationToken;
    
                    ApiAppClient.UpdateXZUMOAUTHToken(applicationToken);
                }
            }
        }
    
  2. ApiAppClient.UpdateXZUMOAUTH调用只执行以下操作:

        if (this.HttpClient.DefaultRequestHeaders.Contains("x-zumo-auth") == true)
        {
            this.HttpClient.DefaultRequestHeaders.Remove("x-zumo-auth");
        }
    
        this.HttpClient.DefaultRequestHeaders.Add("x-zumo-auth", applicationToken);
    


  3. 使用ApiAppClient(使用来自我的Azure AppService WebAPI的swagger json的AutoRest创建)的任何后续调用都包含x-zumo-auth标头并经过适当的身份验证。

    尝试使用MicrosoftAccount时出现问题。我似乎无法从MSAL或LoginWithMicrosoftAsync获取在x-zumo-auth中使用的正确令牌。

    对于上面的#1,在尝试使用MicrosoftAccount时,我使用了MSAL,如下所示:

    AuthenticationResult result = await MSAuthentication_AcquireToken();  
    JObject token = JObject.FromObject(new{access_token = result.Token});
    
  4. 和MSAuthentication_AcquireToken定义如下,使用Azure示例中建议的接口和类:https://github.com/Azure-Samples/active-directory-xamarin-native-v2

          private async Task<AuthenticationResult> MSAuthentication_AcquireToken()
           {
           IMSAcquireToken at = new MSAcquireToken();
            try
            {
                AuthenticationResult res;
                res = await at.AcquireTokenAsync(App.MsalPublicClient, App.Scopes);
    
                return res;
            }
          }
    

    更新 - 使用MobileServiceClient确定,但仍然无法使用MSAL
    我使用MobileServiceClient进行如下操作:
    1.使用MobileService.LoginAsync
    2.获取返回的User.MobileServiceAuthenticationToken
    3.将X-ZUMO-AUTH标头设置为包含User.MobileServiceAuthenticationToken

    user = await App.MobileService.LoginAsync(MobileServiceAuthenticationProvider.MicrosoftAccount);  
    applicationToken = user.MobileServiceAuthenticationToken;  
    ApiAppClient.UpdateAppAuthenticationToken(applicationToken);  
    


    MSAL仍无法正常使用!
    所以原始问题仍然存在,我们需要将从MSAL返回的令牌的哪一部分传递给X-ZUMO-AUTH或其他一些头,以便对Azure AppService WebAPI应用程序的调用进行身份验证?

1 个答案:

答案 0 :(得分:0)

  

我有一个应用程序(目前在UWP中),它将MobileServiceClient和AutoRest用于Azure App Service API应用程序。我成功使用了winfbsdk并可以通过它进行身份验证,然后使用FB访问令牌作为JObject登录到MobileService.LoginAsync。当我在应用程序中通过AutoRest调用API应用程序时,我也会使用该JObject并将其发送到x-zumo-auth标头中。

根据您的描述,我假设您使用的是Client-managed authentication。您直接联系身份提供商,然后在登录期间使用移动后端提供令牌,然后您可以利用MobileServiceClient.InvokeApiAsync来调用您的API APP,这将添加X-ZUMO-AUTH标头,其值为{在您调用authenticationToken

之后{1}}
  

我想要做的是能够使用MicrosoftAccount进行身份验证。如果我使用MobileService.LoginAsync,我无法获得正确的令牌并将其传递给AutoRest - 它总是以401 Unauthorized的形式返回。我试图使用MSAL,但它返回一个Bearer令牌,并且传递它也会返回401 Unauthorized。有什么好办法吗?

AFAIK,用于客户端流认证模式(AAD,Facebook,Google)MobileServiceClient.LoginAsync(MobileServiceAuthenticationProvider.Facebook, token);的{​​{1}}参数看起来像token

对于客户端流认证(Microsoft帐户),您可以使用LoginAsync,也可以将{"access_token":"{the_access_token}"}与值MobileServiceClient.LoginWithMicrosoftAccountAsync("{Live-SDK-session-authentication-token}")参数一起使用LoginAsynctoken。我已使用MSA中的{"access_token":"{the_access_token}"}测试了{"authenticationToken":"{Live-SDK-session-authentication-token}"},并按如下方式检索记录的信息:

enter image description here

总之,当您使用移动后端登录后检索LoginAsync时,可以使用access_token为每个API APP请求添加authentionToken标头。

enter image description here

有关详细信息,请参阅此官方文档authentication works in App Service

<强>更新

我已经检查过此https://github.com/Azure-Samples/active-directory-xamarin-native-v2,并在验证用户身份并获取访问令牌时使用fiddler来捕获网络包。我发现MSAL正在对Microsoft Graph and REST起作用,当用户登录时,您只能检索X-ZUMO-AUTHauthentionToken,并且这两个都无法用于单点登录你的移动后端。

虽然有关使用MSA的Azure移动应用程序的客户端管理身份验证的官方代码示例正在使用Live SDK。正如Live SDK REST API提到的signing users,您可以获得访问令牌身份验证令牌,用于单点登录方案。此外,我已检查Server-managed authentication并发现MSA的应用服务身份验证/授权也使用Live SDK REST API。 总之,您无法使用MSAL进行客户端管理的MSA身份验证,对于客户端管理的身份验证,您需要利用Live SDK检索access_token,然后调用id_token来检索authentication_token来自您的移动后端。或者您可以只为MSA利用服务器管理的身份验证。有关Live SDK的更多详细信息,请参阅LiveSDK