【发布时间】:2014-05-21 07:17:49
【问题描述】:
我们的客户要求我完成以下任务:
使经过身份验证的用户无法修改其他用户的信息
目前,手机应用程序通过 HTTPS 向我们的 API 发送用户用户名和密码作为 BASIC auth 标头:base64(username:password)。
在 WebAPI 中,我创建了一个 BasicAuthenticationMessageHandler。在这个处理程序中,我根据客户 LDAP 验证用户凭据。
这一切都很好。
我有一个名为 Customer 的控制器:
[Authorize]
public class CustomerController : BaseApiController<CustomerMapper>
{ ... }
如上所示,我用 Authorize 属性装饰它。
我有一个 PUT 方法:
public HttpResponseMessage Put(CustomerPutModel data)
{
if (ModelState.IsValid)
{
var c = customerService.GetByID(data.ID);
if (c != null)
{
c = ModelMapper.Map<CustomerPutModel, Customer>(data, c);
customerService.Update(c);
return new HttpResponseMessage(HttpStatusCode.NoContent);
}
}
throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.BadRequest));
}
型号:
public class CustomerPutModel
{
public int ID{ get; set; }
[Required]
public string CustomerAccountID { get; set; }
[Required]
public string FirstName { get; set; }
[Required]
public string LastName { get; set; }
[Required]
public string City { get; set; }
[Required]
public string State { get; set; }
public int Zipcode { get; set; }
}
此控制器方法按预期工作。
我遇到的问题是,如何防止我的 PUT 方法(以及所有其他控制器/方法)中出现以下情况:
- 用户 1 具有正确的身份验证凭据
- 用户 1 使用代理监听请求
- 用户 1 将请求正文的 ID 从他们的 ID 更改为用户 2 的 ID
- 用户 1 发送带有正确身份验证标头的 PUT,但在正文中他们传递了另一个用户 ID
如何在方法级别防止这种情况发生?由于应用程序的不同部分会触发某些控制器操作,我认为我无法保护所有这些操作。
授权经过身份验证的用户实际上可以执行他们请求的操作的正确方法是什么?这是否需要为每个方法操作进行自定义编码??
【问题讨论】:
标签: c# asp.net-web-api authorization basic-authentication restful-authentication