servicestack - 如何以编程方式为服务和/或 RequestDTO 分配角色和权限

标签 servicestack

静态地,我像这样设置对我的服务的访问权限:

[Authenticate]
public class AppUserService : Service
{
    [RequiredRole("Administrator")]
    public object Post(CreateAppUser request)
    {
         //.....
    }
}

我如何以编程方式执行此操作?

我会让用户使用 GUI 创建角色。然后我将提供可用方法的列表,例如通过使用改进的代码提供方法,例如:

        var appHost = HostContext.AppHost;
        var restPaths = appHost.RestPaths;
        foreach (var restPath in restPaths)
        {
            var reqType = restPath.RequestType;
            string verbs = string.Empty;
            if (restPath.Verbs != null)
            {
                var counter = 0;
                foreach (var verb in restPath.Verbs)
                {
                    if (counter > 0) verbs += ", ";
                    verbs += verb;
                    counter++;
                }  
            }
            Debug.WriteLine($"Path: {restPath.Path} | Verbs: {verbs} | Name: {reqType.Name} FullName: {reqType.FullName}");
        }

上面的代码输出类似

Path: /appusers | Verbs: POST | Name: CreateAppUser FullName: MyServer.ServiceModel.DTOs.Request.CreateAppUser

所以我可以在我的 UI 中显示 RequestTypeName 属性,并让他定义允许哪些角色调用此方法。因此,用户可以创建一个名为“用户管理”的角色,并允许该角色的成员执行 CreateAppUser

使用注释我会写

[RequiredRole("Administrator", "User Management")]
public object Post(CreateAppUser request)
{ .... }

这在 C# 代码中是否可行?

最佳答案

ServiceStack 确实有一种在运行时动态添加属性的方法,例如:

typeof(CreateAppUser)
  .AddAttributes(new RequiredRoleAttribute("Administrator", "User Management"));

这是静态声明属性的替代方案,但它仍然不是数据驱动授权系统的解决方案。

但是除了 ServiceStack 的内置属性之外,您还可以通过在服务中验证它来添加自己的自定义授权逻辑:

public ICustomAuth CustomAuth { get; set; }

public object Post(CreateAppUser request)
{
    var session = base.GetSession();
    var requiresRoles = CustomAuth.GetRequiredRoles(request.GetType());
    var hasAllRoles = requiresRoles.All(r => 
        session.HasRole(r, base.AuthRepository))
    if (!hasAllRoles)
        throw new UnauthorizedAccessException("Requires all roles");
}

如果您经常这样做,您将希望将自定义验证逻辑重构为单个可重用方法,或者如果您更喜欢自定义 RequestFilter 属性。

关于servicestack - 如何以编程方式为服务和/或 RequestDTO 分配角色和权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40301327/

相关文章:

ServiceStack RegistrationFeature 和 Localized Validation 消息

ServiceStack 返回 JSV 而不是 JSON

c# - ServiceStack 与 NServiceBus

redis - 从哈希中清除 X 键

asp.net-mvc - 使用 ServiceStack MVC Powerpack + Funq 进行构造函数注入(inject)

permissions - Servicestack 4.5.6 破坏了 HasRole 和 HasPermission

c# - Service Stack 的 DTO 模式真的有用吗?

c# - 跨 AppDomain 实现引用计数的最佳方式是什么?

servicestack - ServiceStack 中的版本控制 - 再次

node.js - 分布式认证