Azure移动服务,HttpClient,授权

Por*_*iey 7 .net c# authentication mobile azure

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

如何使用HttpClient 对移动服务自带的自定义身份验证/授权模式进行身份验证

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

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

此外,为什么我使用移动服务客户端,为什么我的应用程序密钥,主密钥或用户身份验证密钥总是返回(401)未授权?

客户:

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

服务方面:

[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";
    }
}
Run Code Online (Sandbox Code Playgroud)

Por*_*iey 12

"我可以使用.NET的HttpClient来访问Azure Mobile服务吗?" 简短的回答是肯定的.简单的方法是将其添加到客户端的标头:

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

但要小心,如果你使用的是本地托管版本,你需要确保你...

  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>
    
    Run Code Online (Sandbox Code Playgroud)

如果没有#1,整个服务的身份验证将被完全忽略,因此您不知道您在客户端中添加身份验证的方式是否正常.如果没有#2,您可以将密钥添加到客户端(您从Azure获得),但它将始终返回401.这可能是关于使用MobileServiceClient始终返回401 的第二个问题的答案.

最后,您可以使用三种不同的标题.您可以使用每个不同级别的授权.从这个MSDN文档:

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

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

  • 非常有用的描述,并且从我能够挖掘的任何文档中严重缺失.谢谢! (3认同)