【发布时间】:2013-09-22 03:53:41
【问题描述】:
假设您有一个带有 GetResource(int resourceId) 操作的 .net web api。此操作(具有指定的 id)应该只授权给与该 id 关联的用户(例如,资源可以是用户撰写的博客文章)。
这可以通过多种方式解决,但下面给出一个示例。
public Resource GetResource(int id)
{
string name = Thread.CurrentPrincipal.Identity.Name;
var user = userRepository.SingleOrDefault(x => x.UserName == name);
var resource = resourceRepository.Find(id);
if (resource.UserId != user.UserId)
{
throw new HttpResponseException(HttpStatusCode.Unauthorized);
}
return resource;
}
用户已通过某种机制的身份验证。
现在,假设我还希望某个用户(例如,管理员类型)被授权使用端点(具有相同的 id)。此用户与资源没有任何直接关系,但由于其类型(或角色)而具有授权。这可以通过检查用户是否为管理员类型并返回资源来解决。
有没有什么方法可以集中处理,这样我就不必在每个操作中编写授权代码?
编辑 根据答案,我认为我必须澄清我的问题。
我真正追求的是某种机制,使基于资源的授权成为可能,但同时允许一些用户也使用相同的端点和相同的资源。下面的操作将为这个特定的端点和这个特定的角色(管理员)解决这个问题。
public Resource GetResource(int id)
{
string name = Thread.CurrentPrincipal.Identity.Name;
var user = userRepository.SingleOrDefault(x => x.UserName == name);
var resource = resourceRepository.Find(id);
if (!user.Roles.Any(x => x.RoleName == "Admin" || resource.UserId != user.UserId)
{
throw new HttpResponseException(HttpStatusCode.Unauthorized);
}
return resource;
}
我追求的是一些通用的方法来解决这个问题,这样我就不必编写两个具有相同目的的不同端点或在每个端点中编写资源特定的代码。
【问题讨论】:
标签: .net asp.net-mvc asp.net-web-api authorization