Azure移动服务,HttpClient,授权

时间:2015-01-23 18:33:45

标签: c# .net authentication azure mobile

我可以使用.NET的HttpClient来访问Azure移动服务吗?

如何使用HttpClient在custom Authentication/Authorization patterns中使用移动服务进行身份验证?

这总是返回401,因为我没有传递任何身份验证凭据:

var client = new HttpClient();           
var response = client.GetAsync("http://localhost:49190/api/test").Result;

此外,为什么我使用Mobile Service Client,为什么我的应用程序密钥,主密钥或用户身份验证密钥总是返回(401)未授权?

客户端:

var mobileClient = new MobileServiceClient("http://localhost:49190/", "[my key]");
var response = mobileClient.InvokeApiAsync("test").Result;

服务方:

[AuthorizeLevel(AuthorizationLevel.Application)]
public class TestController : ApiController
{
    public ApiServices Services { get; set; }

    // GET api/Test
    public string Get()
    {
        Services.Log.Info("Hello from custom controller!");
        return "Hello";
    }
}

1 个答案:

答案 0 :(得分:12)

“我可以使用.NET的HttpClient来命中Azure Mobile服务吗?”简短的回答是肯定的。简单的方法是将其添加到客户端的标题中:

        var client = new HttpClient();           
        client.DefaultRequestHeaders.Add("X-ZUMO-APPLICATION", "[my key]");

但请注意,如果您使用的是本地托管版本,则需要确保自己...

  1. 强制服务认为它是托管的,以便启用身份验证。

    (在App_Start / WebApiConfig.cs中:config.SetIsHosted(true);

  2. 将应用程序密钥和主密钥添加到web.config:

    <appSettings>
    <add key="MS_MasterKey" value="[your master key]" />
    <add key="MS_ApplicationKey" value="[your app key]" />
    </appSettings>
    
  3. 如果没有#1,整个服务的身份验证将被完全忽略,因此您不知道您在客户端中添加身份验证的方式是否正常。如果没有#2,您可以将密钥添加到客户端(您从Azure获得),但它总是返回401.这可能是发布的关于使用MobileServiceClient总是返回的第二个问题的答案401.

    最后,您可以使用三种不同的标题。您可以使用每个不同级别的授权。从MSDN doc

    开始
    • X-ZUMO-APPLICATION - 移动服务的应用程序密钥。必要时,必须指定有效的应用程序密钥才能访问表操作。这是默认的表操作访问权限。
    • X-ZUMO-AUTH - 经过身份验证的用户的服务生成的身份验证令牌。必要时,必须为经过身份验证的用户指定令牌才能访问表操作。
    • X-ZUMO-MASTER - 服务主密钥。只有在需要管理员访问才能访问表操作时,才应包含此密钥。

    作者注意:我个人很难让这个工作,并且对于这种特定风格的文档有限或缺少,我想写这个Q / A.如果您认为我应该添加任何东西,请告诉我。