将上述服务与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
这也使ID不同:
我不能在这里正确传递令牌。
答案 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);
}
}