gpt4 book ai didi

.net - 对特定资源的声明授权

转载 作者:行者123 更新时间:2023-12-04 11:08:38 24 4
gpt4 key购买 nike

我正在编写一个示例文件存储系统(仅用于 stackoverflow 的示例)。

我当前的域模型如下所示:

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 应与登录的身份匹配在用户中)。

我的文件 Controller 如下所示。
[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 不是适合这项工作的工具,但希望这能说明问题。

我应该如何连接我的 Controller 以确保当前登录的用户有权执行特定操作,更具体地说是某些资源?

最佳答案

我不确定 claim 是否是您正在做的事情的正确方法。您真正想要代表的是权限。声明通常表示身份属性,例如用户名、电子邮件或它所属的角色,但不表示权限。您可以使用声明来表示权限,但根据您的应用程序的大小,您可能需要大量的权限。一种典型的方法是将角色映射到一组权限(在您的情况下,添加文件将是一种权限)。您还可以创建从 AuthorizeAttribute 派生的自定义授权过滤器,以检查当前主体是否具有执行操作的正确权限。该过滤器可能会收到执行操作所需的权限作为参数。

关于.net - 对特定资源的声明授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16326584/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com