带有API控制器的Azure移动应用OAuth

时间:2016-08-23 15:04:36

标签: azure authentication oauth xamarin.forms azure-mobile-services

将上述服务与Xamarin表单一起使用,我已在服务器级启用了OAuth(Microsoft和Google)身份验证。

来自Swagger的电话工作正常。但是,我正在通过应用程序访问此 401错误。这既不适用于 TableController 也不适用于 APIController 。我没有使用 EasyTables 。以下是我的代码。

public async Task<bool> AuthenticateAsync()
{
    bool success = false;
    try
    {
        if (user == null)
        {
            user = await ItemManager.DefaultManager.CurrentClient.LoginAsync(this, MobileServiceAuthenticationProvider.MicrosoftAccount);

            Constants.MobileToken = user.MobileServiceAuthenticationToken;
        }
        success = true;
    }
    catch (Exception ex)
    {
        CreateAndShowDialog(ex.Message, "Authentication failed");
    }
    return success;
}

public async Task<ObservableCollection<Item>> GetItemsAsync(bool syncItems = false)
    {
        try
        {
            IEnumerable<Item> items = await itemTable
                .ToEnumerableAsync();

            return new ObservableCollection<Item>(items);
        }
        catch (MobileServiceInvalidOperationException msioe)
        {
            Debug.WriteLine(@"Invalid sync operation: {0}", msioe.Message);
        }
        catch (Exception e)
        {
            Debug.WriteLine(@"Sync error: {0}", e.Message);
        }
        return null;
    }

我尝试使用rest服务客户端,但不确定如何传递身份验证标头。正如我在Swagger看到的那样,它实际上通过cookie发送 AppServiceAuthSession 。应该如何通过Xamarin Forms完成?

    public ItemManager(IRestService service)
    {
        restService = service;
    }

    public Task<List<Item>> GetTasksAsync()
    {
        return restService.RefreshDataAsync();
    }

我读到我们必须提供的令牌'X-ZUMO-AUTH'不是提供商发回给我们的访问令牌;它是移动服务后端发回的令牌。我们如何设法检索此令牌?而且我没有看到Swagger发送X-Zumo-Auth标题。

以下是我的Rest Service初始化:

    public RestService()
    {


        client = new HttpClient(new LoggingHandler(true));
        client.MaxResponseContentBufferSize = 256000;
        client.DefaultRequestHeaders.Add("x-access_type", "offline");
        client.DefaultRequestHeaders.Add("x-zumo-auth", Constants.MobileToken);
        client.DefaultRequestHeaders.Add("ZUMO-API-VERSION", "2.0.0");
    }

 public async Task<List<Item>> RefreshDataAsync()
    {
        Items = new List<Item>();
        var uri = new Uri(string.Format(Constants.RestUrl, string.Empty));
        try
        {
            var response = await client.GetAsync(uri);
            if (response.IsSuccessStatusCode)
            {
                var content = await response.Content.ReadAsStringAsync();
                Items = JsonConvert.DeserializeObject<List<Item>>(content);
            }
        }
        catch (Exception ex)
        {
            Debug.WriteLine(@"              ERROR {0}", ex.Message);
        }

        return Items;
    }

修改

启用服务器日志记录后 - Azure服务实际上正在抛出 404 错误。这只有在我在服务器上启用自定义授权时才会发生。

调试代码后,我注意到Mobile App与Swagger处理的身份验证之间存在以下差异: 移动应用将身份验证类型设置为联盟,但Swagger正确将其设置为 microsoftaccount Mobile App Swagger

这也使ID不同:

Mobile App Swagger

我不能在这里正确传递令牌。

1 个答案:

答案 0 :(得分:0)

所以我到目前为止所知道的是,我需要使用当前用户令牌传递标题 X-ZUMO-AUTH 以使其正常工作。

并在API代码中处理此标头以检索用户详细信息

         //Try to retrieve from header if available
        actionContext.Request.Headers.TryGetValues("x-zumo-auth", out auth_token);

        if (auth_token !=null)
        {
            try
            {
                string urlPath = string.Concat(new Uri(actionContext.Request.RequestUri, actionContext.Request.GetRequestContext().VirtualPathRoot).AbsoluteUri, ".auth/me");
                var result = Get<List<AzureUserDetail>>(HttpWebRequest.Create(urlPath), auth_token.FirstOrDefault(), null)?.FirstOrDefault();
                userID = result.User_Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier).Val;
            }
            catch
            {
                actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.NotAcceptable);
            }
        }