Azure 移动服务,HttpClient,授权

7

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

如何使用HttpClient与Mobile Service的内置自定义身份验证/授权模式进行身份验证?

由于没有传递任何身份验证凭据,此操作始终返回401:

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

此外,我使用移动服务客户端时,为什么我的应用程序密钥、主密钥或用户授权密钥总是返回(401)未经授权的状态呢?请参考Mobile Service Client
客户端:
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个回答

12
“我能使用.NET的HttpClient访问Azure移动服务吗?” 简短的回答是可以。简单的方法是在客户端的标头中添加以下内容:
        var client = new HttpClient();           
        client.DefaultRequestHeaders.Add("X-ZUMO-APPLICATION", "[my key]");

请注意,如果您正在使用本地托管的版本,则需要确保您已经...

  1. Forced the service to think it's hosted so that it enables Authentication.

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

  2. Added the application key and master key to the web.config:

    <appSettings>
    <add key="MS_MasterKey" value="[your master key]" />
    <add key="MS_ApplicationKey" value="[your app key]" />
    </appSettings>
    
没有 #1,服务之间的身份验证将被完全忽略,因此您不知道在客户端中添加身份验证是否有效。没有 #2,您可以随意向客户端添加密钥(从 Azure 获取),但它总是会返回 401。这可能是有关使用 MobileServiceClient 总是返回 401 的第二个问题的答案。
最后,您总共可以使用三个不同的标头。根据此 MSDN doc
  • X-ZUMO-APPLICATION - 移动服务的应用程序密钥。必须在需要访问表操作时指定有效的应用程序密钥。这是默认的表操作访问权限。
  • X-ZUMO-AUTH - 针对已验证用户的服务生成的身份验证令牌。必须在需要访问表操作时为已验证的用户指定令牌。
  • X-ZUMO-MASTER - 服务主键。只有在需要管理员访问才包含此键以访问表操作。
  • 作者注:我个人在使用这种样式时遇到了困难,并且在这方面的文档要么有限,要么缺失,因此我想写这篇问答文章。如果您认为我应该添加任何内容,请告诉我。


    3
    非常有用的描述,这个描述在我找到的所有文档中都缺失了。谢谢! - Nathan Taylor
    我在哪里获取这些密钥?Azure门户和web.config都不包含任何密钥。 - Anthony
    @Anthony,我已经有一段时间没有碰这个了,但我相信我只是自己设置的;但我不能确定。 - Porschiey

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接