gpt4 book ai didi

c# - 在 ServiceStack 中进行属性级别授权的最佳方式?

转载 作者:行者123 更新时间:2023-11-30 21:59:49 26 4
gpt4 key购买 nike

我目前正在使用 Angular 开发 SPA,因此我使用 ServiceStack 创建了一个 REST 服务。我还使用了 ServiceStack 的默认身份验证和授权解决方案,它允许我使用 Authenticate 属性装饰服务,还允许我授权 Angular 色。

但是,由于我的应用程序有用户,而用户拥有资源,我需要一种方法来限制未授权用户执行某些操作。此外,我希望能够为每个离散实体创建一个服务,该服务可以根据用户的授权级别正确地确定写入数据库的内容是安全的,返回给用户的内容是安全的。

举个例子,假设我创建了一个服务来处理对 Group 实体的操作。我允许对 Group 执行的操作之一是获取其详细信息:

  • 路线:api/groups/{Id}
  • 响应:名称描述CoverImageUrl成员

但是,根据用户是谁,我希望限制返回的数据:

  • 未通过身份验证:名称CoverImageUrl
  • 已验证:名称CoverImageUrl描述
  • 所请求组的成员:完全访问权限
  • 网站管理员:完全访问权限

因此,一种简单的方法是创建 3 个不同的响应 DTO,每个响应类型对应一个。然后在服务本身中,我可以检查用户是谁,检查他们与资源的关系,并返回适当的响应。这种方法的问题是我会重复很多次,并且会创建 DTO,而这些 DTO 只是“主”DTO 的子集。

对我来说,理想的解决方案是使用如下属性装饰 DTO 上的每个属性:

  • [CanRead("Admin", "Owner", "Member")]
  • [CanWrite("Admin", "Owner")]

然后在请求期间的某处,它会根据用户身份限制写入数据库的内容,并且只会序列化允许用户读取的“主”DTO 的子集。

有谁知道我如何在 ServiceStack 中获得理想的解决方案,或者更好的解决方案?

最佳答案

直接方法是最简单的,但您也可以利用 custom filters attributes .

[Route("/groups/{Id}"]
public class UpdateGroup
{
public int Id { get; set; }
public string Name { get; set; }
public string CoverImageUrl { get; set; }
public string Description { get; set; }
}

[RequiresAnyRole("Admin", "FullAccess")]
[Route("/admin/groups/{Id}"]
public class AdminUpdateGroup
{
public int Id { get; set; }
public string Name { get; set; }
public string CoverImageUrl { get; set; }
public string Description { get; set; }
//... other admin properties
}

服务实现:

public object Any(UpdateGroup request)
{
var session = base.SessionAs<AuthUserSession>();
if (session.IsAuthenticated) {
//.. update Name, CoverImageUrl, Description
}
else {
//.. only update Name, CoverImageUrl
}
}

public object Any(AdminUpdateGroup request)
{
//... Full Access
}

关于c# - 在 ServiceStack 中进行属性级别授权的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28991251/

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