打开App Service身份验证时,Mobile App Server不会从客户端接收PushAsync呼叫

时间:2016-02-23 08:06:31

标签: azure azure-mobile-services

我正在为移动应用后端/服务器使用Azure移动应用服务。

当App Service Authentication为Off时,客户端可以将项目插入远程表。 (我使用portal.azure打开和关闭App Service Auth)。

但是,启用App Service身份验证似乎会阻止PushAsync在表控制器中调用关联的Post方法。我知道,因为每当请求进入表控制器中的方法时,我都会输入写入App Logs的代码。

当App Service身份验证关闭时,我可以看到PostItem中的Trace打印代码写入App Logs,然后是GetAll Trace打印代码。

当App Service Auth为On时,PostItem方法中的Trace打印代码没有写入,这意味着PostItem未被调用。但是,GetAll Trace打印代码仍写入App Logs。

由于用户使用MobileServiceClient.LoginAsync

登录,因此用户已通过身份验证

有谁知道我如何调试和/或解决这个问题?

更新1

这是表控制器

[Authorize]
public class ItemController : TableController<Item>
{
    protected override void Initialize(HttpControllerContext controllerContext)
    {
        base.Initialize(controllerContext);
        MobileServiceContext context = new MobileServiceContext();
        DomainManager = new EntityDomainManager<Item>(context, Request);
    }

    // GET tables/Item
    public async Task<IQueryable<Item>> GetAllItem()
    //public IQueryable<Item> GetAllItem()
    {
        // Initialize variable
        string userGUID = "";

        // Retrieve credentials of requester
        AzureActiveDirectoryCredentials userCreds = await User.GetAppServiceIdentityAsync<AzureActiveDirectoryCredentials>(Request);

        System.Diagnostics.Trace.TraceInformation("Get All Item Controller");

        // If usercreds is not null, retrieve requester's GUID
        if (userCreds != null) userGUID = userCreds.ObjectId;

        //Retrieve items that match user's aad id AND item that is not deleted
        var query = Query().Where(item => !item.Deleted && item.RequesterId.Equals(userGUID, System.StringComparison.OrdinalIgnoreCase));

        // return query;
        return Query();
    }

    // GET tables/Item/48D68C86-6EA6-4C25-AA33-223FC9A27959
    public SingleResult<Item> GetItem(string id)
    {
        return Lookup(id);
    }

    // PATCH tables/Item/48D68C86-6EA6-4C25-AA33-223FC9A27959
    public Task<Item> PatchItem(string id, Delta<Item> patch)
    {
         return UpdateAsync(id, patch);
    }

    // POST tables/Item
    public async Task<IHttpActionResult> PostItem(Item item)
    {

        System.Diagnostics.Trace.TraceInformation("Post Item Controller");

        AzureActiveDirectoryCredentials userCreds = await User.GetAppServiceIdentityAsync<AzureActiveDirectoryCredentials>(Request);

        // Set requester id for item
        item.RequesterId = userCreds.ObjectId;

        // Save item to db
        Item current = await InsertAsync(item);

        return CreatedAtRoute("Tables", new { id = current.Id }, current);
    }

    // DELETE tables/Item/48D68C86-6EA6-4C25-AA33-223FC9A27959
    public Task DeleteItem(string id)
    {
         return DeleteAsync(id);
    }
}

更新2

在PostItem中,我将检索请求者凭据的代码放在try-catch中。

// POST tables/Item
public async Task<IHttpActionResult> PostItem(Item item)
{
    // Initialize variable
    string userId = "";

    System.Diagnostics.Trace.TraceInformation("Post Item Controller");


    AzureActiveDirectoryCredentials userCreds = null;

    // Retrieve credentials of requester
    try
    {
        userCreds = await User.GetAppServiceIdentityAsync<AzureActiveDirectoryCredentials>(Request);
    }
    catch(Exception e)
    {
        System.Diagnostics.Trace.TraceInformation(e.Message);
    }

    if (userCreds != null) System.Diagnostics.Trace.TraceInformation("user creds is null");
    else System.Diagnostics.Trace.TraceInformation("user creds is not null");

    // If usercreds is not null, retrieve requester's id
    if (userCreds != null) userId = userCreds.ObjectId;

    // Set requester id for item
    item.RequesterId = userId;
    // Save item to db
    Item current = await InsertAsync(item);
    return CreatedAtRoute("Tables", new { id = current.Id }, current);
}

我收到的错误消息:“IPrincipal的声明必须包含'iss'声明。”

1 个答案:

答案 0 :(得分:0)

我有一个理论 - 尝试用'https'而不是'http'创建MobileServiceClient。身份验证要求'iss'和'aud'完全匹配当前请求的URL,我怀疑您的请求实际上没有正确验证。

但是,如果您的控制器上有[Authorize]用于所有测试,那么这并不能解释请求是如何通过的 - 这是一直存在的吗?如果请求未经过验证,我希望客户来电可以获得401。