我写一个例子文件存储系统(例如只是计算器)。
我现在的域模型看起来像这样:
public class User
{
public int ID { get; set; }
public string LoginIdentifier { get; set; }
public string Password { get; set; }
}
public class File
{
public int ID { get; set; }
public int UserID { get; set; }
public string FileName { get; set; }
public byte[] Data { get; set; }
}
该代码我写创建的IPrincipal:
private static IPrincipal CreatePrincipal(User user)
{
Debug.Assert(user != null);
var identity = new GenericIdentity(user.LoginIdentifier, "Basic");
// TODO: add claims
identity.AddClaim(new Claim("Files", "Add"));
return new GenericPrincipal(identity, new[] { "User" });
}
在我的系统中,用户可以添加文件,他们还可以检索,删除和更新它们,但是,告诫这是一个用户只能检索和修改自己的文件(其中File.UserID
应该匹配记录的身份用户)。
我的文件控制器如下所示。
[Authorize]
public class FilesController : ApiController
{
private readonly FileRepository _fileRepository = new FileRepository();
public void Post(File file)
{
// not sure what to do here (...pseudo code...)
if (!CheckClaim("Files", "Add"))
{
throw new HttpError(HttpStatusCode.Forbidden);
}
// ... add the file
file.UserID = CurrentPrincipal.UserID; // more pseudo code...
_fileRepository.Add(file);
}
public File Get(int id)
{
var file = _fileRepository.Get(id);
// not sure what to do here (...pseudo code...)
if (!CheckClaim("UserID", file.UserID))
{
throw new HttpError(HttpStatusCode.Forbidden);
}
return file;
}
}
也许使用Claim
s是不是为工作的工具,但希望这能说明问题。
我应该如何线了我的控制器,以确保当前登录的用户可以访问做具体的行动和更具体的,特定的资源?