0

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

WIF ( Windows Identity Foundation ) 解决方案是否适合以下情况:

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

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

  • 如果WIF适合,了解任何关键字以在谷歌上搜索如何开始执行逻辑部分的解决方案会很有帮助
  • 有没有更好的选择?

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

4

2 回答 2

1

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

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

ABAC 的模型提供

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

例子:

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

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

XACML 架构

由提问者编辑(取自维基百科):

  • PAP - Policy Administration Point - 管理访问授权策略的点
  • PDP - 策略决策点 - 在发布访问决策之前根据授权策略评估访问请求的点
  • PEP - Policy Enforcement Point - 拦截用户对资源的访问请求,向 PDP 发出决策请求以获得访问决策(即对资源的访问被批准或拒绝),并根据收到的决策进行操作的点
  • PIP - 策略信息点 - 充当属性值来源的系统实体(即资源、主题、环境)
  • (PRP) - 策略检索点 - 存储 XACML 访问授权策略的点,通常是数据库或文件系统。
于 2016-02-19T19:52:33.553 回答
0

在第一个方法中,多亏了Dominick Baier的贡献,我想出了一个习惯ClaimsAuthorizationManager。似乎可以使用 WIF 作为解决方案。

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

还有这篇关于类似问题的帖子。


我想到的第一件事就是像这样检查访问权限:

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);
    }
}

请注意,我正在使用 .Net 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();
于 2016-02-19T14:38:42.070 回答