我正在构建一个网络应用程序(asp.net mvc), 我在GET和Post上使用[授权]属性。
例如:
[Authorize]
public ActionResult EditClient(string id)
{
//Do Stuff
}
我现在想确保登录用户只能访问属于该用户\帐户的数据? 但是我不确定如何做到这一点,.Net是否已经提供了使用方法\属性?
例如,这就是我获得客户的方式:
[Authorize]
public ActionResult EditClient(string id)
{
var user= new Token(this.User.Identity.Name);
//user.id
//user.accountId
//So does this Client belong to the same account as the user is in?
//We know the client and user both belong to an account(id)
//Are we allowed to return the below?
var client = _clientService.GetClient(id);
//client.id
//client.accountId
}
如上所述,不确定我应该应用哪些最佳实践\选项,显然我知道我应该在大多数地方应用这种逻辑?
想法?样品
答案 0 :(得分:0)
有很多方法可以实现这一目标。例如,您可以创建一个自定义属性,该属性接收参数并检查资源属于请求用户。这可能会变得复杂,因为您正在访问的每种类型的实体都有许多不同的属性。
你可能想要其他验证规则,例如请求的客户端甚至存在(即不存在的id)我会提取一堆规则,例如实体存在,请求的实体属于授权用户,实体是可编辑的等等并注入在执行更改或返回所述实体之前进入您的操作,您可以根据哪个验证失败来抛出自定义异常,然后以最小的错误详细信息(没有堆栈跟踪)向用户发送通用500或400。所以你的行动看起来像是:
[Authorize]
public ActionResult EditClient(string id)
{
editClientValidator.Validate(id);
var user= new Token(this.User.Identity.Name);
//user.id
//user.accountId
//So does this Client belong to the same account as the user is in?
//We know the client and user both belong to an account(id)
//Are we allowed to return the below?
var client = _clientService.GetClient(id);
//client.id
//client.accountId
}
EditClientValidator类包含用于编辑客户端的自定义规则。或者,您可以创建一个基本上执行相同操作的属性,但仅用于访问(客户端属于经过身份验证的用户)