WIF和授权基于除角色之外的逻辑(也用于禁用按钮)

时间:2016-02-18 14:29:27

标签: .net authorization wif claims-based-identity abac

我们有一个 Asp.Net-Web-Api 服务器端和wpf(桌面)客户端。

WIF Windows Identity Foundation )解决方案是否符合以下条件:

  • 我们不仅需要阻止访问 web-api ,还需要将授权权限信息传递给客户端才能禁用按钮?
  • 授权不仅基于角色。授权权限根据操作类型以及可能应用操作的对象类型而有所不同?例如,操作可以是" attach_document"并且对象可以说" Project"。或者" edit_subentities"对于某个" SuperEntity" ...?
  • 的某个例子
  • 授权也将基于逻辑应用于用户属性对象属性。为了澄清,我们有一个组织的树结构。 用户属于某些组织对象应与某个组织相关联。 仅针对某些角色,权利取决于 对象的是否是经过身份验证的用户组织的下属这一事实或不。 ...?

其次(不确定是否正确),

  • 如果 WIF 适合,了解有关如何开始使用逻辑部分的解决方案实施的任何关键字将会有所帮助
  • 还有更好的选择吗?

很抱歉,如果问题太宽或有些不清楚或不正确。在花费时间进行实验之前,知道 WIF 解决方案不是我们案例中最好的选择会很有帮助。坦克很多!

2 个答案:

答案 0 :(得分:1)

查看基于属性的访问控制模型ABAC()。它是一个更新的模型,它不仅仅是查看角色(RBAC),而是查看以下属性:

  • 用户例如角色,部门,清关......
  • 资源,例如分类和其他属性
  • 动作,例如查看,删除,批准
  • 上下文/环境,例如一天中的时间,IP地址......

ABAC的模型提供

  • 外部授权(就像基于声明的授权和RBAC一样)
  • 集中授权:授权逻辑在中央组件中维护
  • 基于策略:授权逻辑表示为将属性绑定在一起的策略。

示例:

  • 如果文档部门==用户部门且文档状态==已发布,则用户可以查看文档。

特别要看一下XACML()。 XACML提供了一个可应用于.NET应用程序的外部化基于策略的授权解决方案。

XACML Architecture

提问者(摘自wikipedia

编辑

  • PAP - 策略管理点 - 管理访问授权策略的点
  • PDP - 策略决策点 - 在发出访问决策之前根据授权策略评估访问请求的点
  • PEP - 策略执行点 - 截取用户对资源的访问请求的点,向PDP发出决策请求以获取访问决策(即,对资源的访问被批准或拒绝),并对收到的决定采取行动
  • PIP - 政策信息点 - 充当属性值来源的系统实体(即资源,主题,环境)
  • (PRP) - 策略检索点 - 存储XACML访问授权策略的位置,通常是数据库或文件系统。

答案 1 :(得分:0)

在第一种方法中,感谢Dominick Baier的贡献,我想出了一个自定义ClaimsAuthorizationManager。似乎可以使用WIF作为解决方案。

  • 仍然不知道WIF是否最合适。
  • 还有一个问题是,在客户端和服务器端之间共享授权逻辑是否可行。还没想过。

还有关于类似问题的帖子this

首先,我要做的就是检查这样的访问:

authorizationManager.CheckAccess("show_subresources", "resource_org_id", "20d55788-bf46-43f0-b6c5-ccb6be687b90");

我正在检查访问权限。至于在方法上方使用属性[ClaimsPrincipalPermission(....)]的声明性方法,这似乎在我们的情况下不起作用,因为在获得资源之前不知道resource_organization_id。经理的第一个方法版本如下:

public class AuthorizationManager : ClaimsAuthorizationManager
{
    public const string ActionType = "http://application/claims/authorization/action";
    public const string ResourceType = "http://application/claims/authorization/resource";

    public override bool CheckAccess(AuthorizationContext context)
    {
        //logic

        return false;
    }

    public bool CheckAccess(string action, params string[] resources)
    {
        var principal = Thread.CurrentPrincipal as ClaimsPrincipal;

        var context = CreateAuthorizationContext(
            principal,
            action,
            resources
            );

        return CheckAccess(context);
    }

    private AuthorizationContext CreateAuthorizationContext(ClaimsPrincipal principal, string action, params string[] resources)
    {
        var actionClaims = new Collection<Claim>
        {
            new Claim(ActionType, action)
        };

        var resourceClaims = new Collection<Claim>();

        if (resources != null && resources.Length > 0)
        {
            resources.ToList().ForEach(ar => resourceClaims.Add(new Claim(ResourceType, ar)));
        }

        return new AuthorizationContext(
            principal,
            resourceClaims,
            actionClaims);
    }
}

请注意,我正在使用。{4.0}的Microsoft.IdentityModel nuget包

应通过app.config文件实现管理器:

<configuration>
    <configSections>
        <section name="microsoft.identityModel" type="Microsoft.IdentityModel.Configuration.MicrosoftIdentityModelSection, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
    <configSections>

    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>

    <system.identityModel>
        <identityConfiguration>
            <claimsAuthorizationManager type="ClaimsAuthorizationJustATry.AuthorizationManager, ClaimsAuthorizationJustATry"/>
        </identityConfiguration>
    </system.identityModel>
</configuration>

但我这样做了:

FederatedAuthentication.ServiceConfiguration.ClaimsAuthorizationManager = new AuthorizationManager();