【问题标题】:Passing parameters to ClaimsPrincipalPermission (Attribute)将参数传递给 ClaimsPrincipalPermission(属性)
【发布时间】:2014-12-26 19:35:26
【问题描述】:

我正在尝试使用声明来控制对 MVC 中资源的访问。但是,当我尝试通过争论保护资源时,我正在挣扎。例如,如果我想允许对他们拥有并拥有以下权利的车辆执行编辑操作:

我添加声明:

  • http://tempuri/registration:AA11XX
  • http://tempuri/registration : BB11YY

我有一个 MVC 操作,例如:

[ClaimsPrincipalPermission(SecurityAction.Demand,Operation = "Post", Resource = "Vehicle/{registration}")]
public ActionResult Edit(string registration)
{
//Stuff
}

我想确保传递给Edit 方法的参数在注册声明列表中。我知道我可以在操作中强制执行此操作,但我想以声明方式执行此操作。

我可以使用 WIF 管道覆盖 CheckAccess 方法。

       public class AuthorisationManager : ClaimsAuthorizationManager
        {
            public override bool CheckAccess(AuthorizationContext context)
{ ... }

AuthorizationContext 包括请求的资源和用户拥有的声明。缺少的环节是知道什么参数被传递到 MVC 动作中。

有没有办法做到这一点,还是我以错误的方式处理整个事情?

非常感谢,

保罗

【问题讨论】:

    标签: c# security claims-based-identity


    【解决方案1】:

    .NET 属性的工作方式,你不能传入动态参数——所以这行不通。

    我们构建了一个更灵活的版本,它可以更好地与 MVC 和 WebAPI 配合使用,并且还有一个命令式 API - 请参阅此示例:

    https://github.com/thinktecture/Thinktecture.IdentityModel/tree/master/samples/SystemWeb/ClaimsAuthorizeSample

    【讨论】:

    • 谢谢。我之前确实看过你的例子。最后,我获取了 routedata 集合并将它们与资源的占位符进行了比较,例如:“Get”、“order/{orderid}”的资源将从 routedata 中查看 orderid。由于 mvc 和 web api 之间的路由差异,这被证明是一种痛苦。我认为总的来说您的解决方案更好,所以我将其标记为答案。我不太确定为什么我如此确定它是声明性的。你显然是这些事情的权威,所以如果我的方法不好是有原因的,请告诉我!
    猜你喜欢
    • 2018-08-03
    • 2011-08-15
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多