我正在使用Azure Mobile Services(遵循标准Azure TodoItems教程),他们提供的最基本的GET
方法是:
public IQueryable<MyModel> GetAllMyInfo()
{
return Query();
}
这是有效的,但我试图扩展它,使该方法将只返回MyModel
数据为一个经过身份验证的用户(由X-ZUMO-AUTH
认证头标准为移动服务API调用标识)。所以我修改了代码:
public IQueryable<MyModel> GetAllMyInfo()
{
// Get the current user
var currentUser = User as ServiceUser;
var ownerId = currentUser.Id;
return Query().Where(s => s.OwnerId == ownerId);
}
这在传递有效的验证令牌时也有效。然而,如果传递无效的验证头,则currentUser
为null
,并且查询失败(显然)。所以我试图检查null并返回BadRequest
或403
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移动应用程序SDK(不是移动服务),上面的属性被简单地替换为[Authorize]
。
我知道这有点晚了,但我会在这里为您和其他可能来寻找类似问题的人记录。
(虽然同意Matt的403可以/应该用[Authorize]
属性来实现,问题是关于返回不同的HttpStatusCode或IQueryable)
我有一个类似的场景,我需要验证一些查询参数,并返回我的结果或HttpError(在我的情况下,我想要一个包含内容的404)。
我找到了2种方法,要么保持返回为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);
}