繁体   English   中英

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

[英]How can I return a BadRequest on Azure Mobile Services TableController GET template method?

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

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

此方法有效,但我尝试对其进行扩展,以便该方法仅返回MyModel身份验证的用户的MyModel数据(由针对Mobile Service 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 ,并且查询失败(很明显)。 所以我试图检查是否为空,并返回BadRequest403 HTTP代码。 但是,简单的返回Return BadRequest(“ Invalid authentication”)会产生编译错误:

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返回类型?

您可以在此方法上使用[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 Mobile Apps SDK(不是移动服务),上述属性仅替换为[Authorize]

我知道这有点晚了,但是将在这里为您和其他可能遇到类似问题的人提供文档。
(虽然与Matt同意可以/应该使用[Authorize]属性实现403,但问题是有关返回不同的HttpStatusCode或IQueryable的问题)

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

我发现了两种方法,要么将返回值保留为IQueryable<T>并抛出HttpResponseException ,要么将返回值更改为IHttpActionResult并使用IHttpActionResult或Ok(Data)返回normal。
我发现更喜欢稍后,因为抛出异常会在调试时中断执行,而不会带来令人愉悦的开发经验。

选项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); 
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM