我正在为移动应用后端/服务器使用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'声明。”
答案 0 :(得分:0)
我有一个理论 - 尝试用'https'而不是'http'创建MobileServiceClient
。身份验证要求'iss'和'aud'完全匹配当前请求的URL,我怀疑您的请求实际上没有正确验证。
但是,如果您的控制器上有[Authorize]
用于所有测试,那么这并不能解释请求是如何通过的 - 这是一直存在的吗?如果请求未经过验证,我希望客户来电可以获得401。