Asp.net web api 角色与声明授权使用WIF和OWIN中间件的Asp.net web api-2 我试图用Windows身份基础2来保护ASP.NET Web API 2。我必须在基于角色的授权和基于声明的授权之间做出选择。作为实践,我在DbInitializer中添加了一个用户,并为他分配了两个角色(管理员和经理)。当我与该用户登录时,我看到ClaimsPrincipal处于调试模式,它已经将那些角色(管理员和管理员)关联为声明。以下是问题:

Asp.net web api 角色与声明授权使用WIF和OWIN中间件的Asp.net web api-2 我试图用Windows身份基础2来保护ASP.NET Web API 2。我必须在基于角色的授权和基于声明的授权之间做出选择。作为实践,我在DbInitializer中添加了一个用户,并为他分配了两个角色(管理员和经理)。当我与该用户登录时,我看到ClaimsPrincipal处于调试模式,它已经将那些角色(管理员和管理员)关联为声明。以下是问题:,asp.net-web-api,asp.net-identity,asp.net-web-api2,owin,claims-based-identity,Asp.net Web Api,Asp.net Identity,Asp.net Web Api2,Owin,Claims Based Identity,如果角色也被视为索赔,那么角色和索赔的区别是什么 如果我远离角色,我如何使用声明来保护web api控制器和相关的操作方法。比如,我有一个包含CRUD方法的orders控制器。我希望一个用户(比如经理)可以访问创建和获取方法,第二个用户(管理员)可以访问所有这些方法 我该怎么做?使用基于角色的系统,我只需使用适当的Authorize(role=“Admin”)属性来修饰操作方法。我将如何管理索赔本身?我是否需要将它们添加到数据库中,并通过我的应用程序向不同的用户授予/撤销这些声明 原则上,角

如果角色也被视为索赔,那么角色和索赔的区别是什么

  • 如果我远离角色,我如何使用声明来保护web api控制器和相关的操作方法。比如,我有一个包含CRUD方法的orders控制器。我希望一个用户(比如经理)可以访问创建和获取方法,第二个用户(管理员)可以访问所有这些方法

    我该怎么做?使用基于角色的系统,我只需使用适当的
    Authorize(role=“Admin”)
    属性来修饰操作方法。我将如何管理索赔本身?我是否需要将它们添加到数据库中,并通过我的应用程序向不同的用户授予/撤销这些声明


  • 原则上,角色和声明之间没有巨大的区别。我已经为基于索赔的授权做好了准备,做了大量的研究和一些测试项目。在一天结束的时候,决定使用哪一个完全取决于你

    正如您所说,角色是作为声明类型添加的。所以在交货条件上没有区别。但是MVC/WebApi已经有了内置的基础设施来处理角色,并在用户没有所需角色时拒绝。所以你不必自己做太多事情。
    但是,您必须在控制器/操作上设置一组属性,并确保它们都存在于数据库中,这样用户就可以分配给它们

    然而,我发现你可以有太多的角色,他们成为太多的负担来维持。此外,您不能为您的用户分配太多的角色-他们的身份验证cookie将变得庞大,最终将由于浏览器中cookie大小的限制而无法登录(每个cookie 4K,所有HTTP头16K)

    有了索赔,你可以更加灵活。您可以有许多不同类型的声明(每个控制器的声明略少于一个)和一些声明值(读取、创建、编辑、删除)。对于一个下降大小的应用程序(我们有100个以上),您必须有很多角色(每个控制器4个)来模拟这种级别的权限控制。对于索赔类型(人员、产品、订单),我们有一个
    enum
    ;对于索赔值(创建、读取、编辑、删除),我们有一个
    enum
    。在cookie中,您可以将整数设置为声明类型和声明值-这在身份验证cookie上节省了大量空间

    但是对于声明,您必须自己编写身份验证机制的代码

    我一直在玩这个概念,这是MVC的,但WebApi过滤器看起来非常相似。目前,该原型的结果已投入生产,运行良好


    总的来说,你的问题的答案是“视情况而定”。主要是关于身份验证的粒度以及应用程序的大小。

    如果我理解正确的话,声明对授权的控制比角色更细粒度。比如说,若我想允许用户阅读订单,我将授予他对订单资源的声明,以便只读?所以,如果我使用claims Identity,我必须将特定用户的声明存储在Identity db中,当他登录时,所有用户的声明都将从db中提取并添加到auth cookie中?我的理解正确吗?我已经从git下载了您的示例并探索了代码。我找不到用启动数据填充数据库的
    Seed
    方法?em。。我在那里不播种子。启动应用程序并注册以创建用户。是的,您理解正确。声明可以在权限粒度方面为您提供更好的灵活性;声明使非常(每个操作)细粒度权限的建模变得更容易。但是,您可以对角色执行相同的操作,但是在大型代码库上建模可能会有更大的问题。是的,当声明在数据库中持久化时,它会自动添加到auth-cookie中。在我下载时,数据库中已经有一些用户