如何在Azure移动服务TableController GET模板方法上返回BadRequest?

时间:2015-08-08 16:28:35

标签: c# linq azure azure-mobile-services

我正在使用 Azure移动服务(遵循标准的Azure TodoItems教程),并且他们提供的最基本的GET方法是:

public IQueryable<MyModel> GetAllMyInfo()
{
    return Query(); 
}

这有效,但我尝试对其进行扩展,以便该方法仅返回经过身份验证的用户的MyModel数据(由移动服务API调用的X-ZUMO-AUTH身份验证标头标准标识)。所以我修改了代码:

public IQueryable<MyModel> GetAllMyInfo()
{
    // Get the current user
    var currentUser = User as ServiceUser;
    var ownerId = currentUser.Id;
    return Query().Where(s => s.OwnerId == ownerId); 
}

当传递有效的身份验证令牌时,这也有效。 但是,如果传递的auth标头无效,则currentUsernull,查询失败(显然)。所以我试图检查null并返回BadRequest403 HTTP代码。然而,一个简单的`返回BadRequest(&#34;无效的身份验证&#34;)给出了编译错误:

public IQueryable<MyModel> GetAllMyInfo()
{
    // Get the current user
    var currentUser = User as ServiceUser;
    if(currentUser == null) {
        return BadRequest("Database has already been created."); // This line gives a compilation error saying I need a cast.
    }
    var ownerId = currentUser.Id;

    return Query().Where(s => s.OwnerId == ownerId); 
}

是否有人知道如何检查有效的身份验证令牌并在此方法上返回403(需要IQueryable返回类型?

2 个答案:

答案 0 :(得分:1)

您可以使用此方法的[AuthorizeLevel]属性来指示必须存在有效​​令牌才能调用该方法。如果不是,它将返回401。

所以你的完整方法是:

[AuthorizeLevel(AuthorizationLevel.User)]
public IQueryable<MyModel> GetAllMyInfo()
{
    // Get the current user
    var currentUser = User as ServiceUser;
    var ownerId = currentUser.Id;
    return Query().Where(s => s.OwnerId == ownerId); 
}

请注意,对于Azure移动应用SDK(非移动服务),上述属性仅替换为[Authorize]

答案 1 :(得分:0)

我知道这有点晚了,但是会在这里为你和其他可能来寻找类似问题的人记录 (虽然同意Matt认为403可以/应该使用[Authorize]属性来实现,但问题是关于返回不同的HttpStatusCode或IQueryable)

我有一个类似的场景,我需要验证一些查询参数,并返回我的结果或HttpError(在我的情况下,我想要一个带内容的404)。

我找到了两种方法,要么将返回值保持为IQueryable<T>并抛出HttpResponseException或将返回值更改为IHttpActionResult并使用HttpStatusCode或Ok(数据)返回正常值。
我发现更喜欢后者因为抛出异常会在调试时破坏执行,而不是非常愉快的开发体验。

选项1(首选)

//Adding Return annotation for API Documentation generation
[ResponseType(typeof(IQueryable<MyModel>))]
public IHttpActionResult GetAllMyInfo()
{
    // Get the current user
    var currentUser = User as ServiceUser;
    if(currentUser == null) {
        return BadRequest("Database has already been created.");
    }
    var ownerId = currentUser.Id;

    return Ok(Query().Where(s => s.OwnerId == ownerId)); 
}

选项2(抛出异常)

public IQueryable<MyModel> GetAllMyInfo()
{
    // Get the current user
    var currentUser = User as ServiceUser;
    if(currentUser == null) {
        throw new HttpResponseException(System.Net.HttpStatusCode.BadRequest)
        // Or to add a content message:
        throw new HttpResponseException(new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.BadRequest) {
            Content = new System.Net.Http.StringContent("Database has already been created.")
        });
    }
    var ownerId = currentUser.Id;

    return Query().Where(s => s.OwnerId == ownerId); 
}