使用ASP.NET MVC进行基于声明的授权

罗密什·D·尼里埃拉

我阅读了很多博客文章和stackoverflow的答案,但仍然找不到一个使用基于声明的身份验证和授权的真实世界的开源项目,因此我可以了解如何实际实现这些内容。

到目前为止,我能找到的是Thinktecture.IdentityModel此博客在示例网站上实现了基于声明的授权。如果你们可以给我指出一些使用声明的开源项目,那将真的很有帮助。

我感兴趣的是如何使用数据库检索我的应用程序的声明。

到目前为止,我已经尝试过使用内存中的声明存储来模拟数据库,我已经创建了一个CustomClaimsTransformerCustomAuthorisationManager就像这样。

public class CustomClaimsTransformer : ClaimsAuthenticationManager
    {
        public override ClaimsPrincipal Authenticate(string resourceName, ClaimsPrincipal incomingPrincipal)
        {
            //validate name claim
            string nameClaimValue = incomingPrincipal.Identity.Name;

            return CreatePrincipal(nameClaimValue);
        }

        private ClaimsPrincipal CreatePrincipal(string userName)
        {
            int userId = ClaimStore.Users.First(u => u.Value == userName).Key;
            var claims = ClaimStore.ClaimsSet.Where(c => c.Key == userId);

            var claimsCollection = claims.Select(kp => kp.Value).ToList();

            return new ClaimsPrincipal(new ClaimsIdentity(claimsCollection, "Custom"));
        }
    }

public class CustomAuthorisationManager : ClaimsAuthorizationManager
    { 
        public override bool CheckAccess(AuthorizationContext context)
        {
            string resource = context.Resource.First().Value;
            string action = context.Action.First().Value;

            if (action == "Show" && resource == "Code")
            {
                bool likesJava = context.Principal.HasClaim(ClaimStore._httpMyclaimsUsers, "True");
                return likesJava;
            }
            else if (action == "Read" && resource == "Departments")
            {
                bool readDeps = context.Principal.HasClaim(ClaimStore._httpMyclaimsDepartments, "Read");
                return readDeps;
            }
            return false;
        }
    }

如何在没有太多中频条件的情况下在现实世界中实现这些功能?

罗密什·D·尼里埃拉

最终,我使用现有的asp.net Identity 2.0表和一些我的表设计了具有所需功能的我自己的系统。

我将每个AREA-CONTROLLER-ACTION三人组称为系统中的资源。包含WebAPI。区域本身就是一种资源。控制器本身就是一种资源。动作本身就是一种资源。它们的任何组合也是一种资源。我将使用反射自动从系统本身生成一切。

另外,我将使用相同的AspNetRoles表来存储我的用户组。用户属于一个或多个组(超级管理员,管理员,代理,客户端等)。

使用现有的基于角色的模型作为具有声明的基于用户组的模型,我可以使其正常工作。超级管理员处于上帝模式。他们可以创建较低级别的用户/组/分配权限等。

用户可以具有特殊权限。例如,“代理中的所有人”组被拒绝访问更新酒店的权限,但是可以为特定的代理(也可能是酒店的所有者)提供特定的访问权限,以便仅更新其酒店。

由于整个访问控制系统都在MVC区域控制器动作集上运行。最初没有人没有访问权限(包括超级管理员),我们逐步定义了组/用户可以访问的部分。并且我们通过声明为超级管理员和管理员授予独占访问权限。默认情况下,拒绝访问任何地方。

一旦我自动生成了AREA-CONTROLLER-ACTION设置,我就让用户选择了哪个组可以访问哪个项目。

当用户登录时,我会获得当前用户有权访问的所有资源,并将其存储为声明。基于此,使用声明身份验证管理器,当用户请求访问某些资源时,我可以检查其声明并决定是否应授予他们访问权限。

foreach(var claim in permissionClaims) {
    var parts = claim.Value.Split(new [] {
        '|'
    }, StringSplitOptions.None);
    if (parts.Length == 3) {
        //var httpMethod = parts[0];
        var action = parts[1]; 
        var api = parts[2];
        //Current.Log.Warn("Checking Access : " + req + " [action: " + action + "]");
        // is this request for a API action?
        if (api.Contains("API")) {
            // if so, req must be for a API action
            if (req.Contains("Api") && action.Contains(req)) {
                Log.Trace("User has access to API : " + req + " [action: " + action + "]");
                return true;
            }
        } else {
            // this is for a MVC action
            if (action.Contains(req)) {
                Log.Trace("User has access to MVC : " + req + " [action: " + action + "]");
                return true;
            }
        }
    }
}

我在这里详细解释了该方法-ASP.NET MVC细粒度身份和访问控制

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用ASP.NET MVC进行基于声明的授权

来自分类Dev

在ASP.Net Identity中使用声明而不是策略进行授权

来自分类Dev

使用ASP.net Identity禁用基于角色的授权的MVC视图中的输入字段

来自分类Dev

在使用AAD的ASP.NET MVC应用程序中使用目录角色进行授权

来自分类Dev

如何在不使用角色的情况下使用ASP.NET WebAPI实现基于声明的授权?

来自分类Dev

ASP.NET MVC + API和WCF具有针对自定义数据库和活动目录的基于声明的授权和身份验证

来自分类Dev

使用基于ASP.NET身份令牌的身份验证在每个Web Api请求中授权声明

来自分类Dev

在ASP.NET MVC 5中使用会话变量进行授权

来自分类Dev

搜索具有大量权限的基于声明的授权的最佳实践asp net core?

来自分类Dev

使用ASP.NET对纯HTML页面进行授权

来自分类Dev

从ASP.Net MVC 6中的OAuth授权服务获取声明

来自分类Dev

基于ASP.NET MVC中角色的自定义用户授权

来自分类Dev

基于ASP.NET MVC 5中角色的单个页面授权

来自分类Dev

具有Azure AD的Asp.net核心基于MVC角色的授权

来自分类Dev

基于ASP.NET MVC 5中角色的单个页面授权

来自分类Dev

asp.net中基于角色的授权

来自分类Dev

使用授权过滤器在asp.net core中实现基于权限的授权

来自分类Dev

如何在ASP.Net Core(WebAPI)中基于HTTP谓词和其他属性声明性地指定授权策略

来自分类Dev

如何对ASP.NET MVC Web应用程序进行授权的HttpWebRequest

来自分类Dev

在ASP.NET MVC中进行用户授权(无需创建表等)的智能方法

来自分类Dev

ASP .Net MVC 4授权和AllowAnonymous

来自分类Dev

LinqToTwitter用户授权ASP.NET MVC

来自分类Dev

ASP.NET MVC和AngularJS授权

来自分类Dev

ASP .Net MVC 4授权和AllowAnonymous

来自分类Dev

LinqToTwitter用户授权ASP.NET MVC

来自分类Dev

如何在ASP.NET Core MVC中基于用户表中的字段添加声明?

来自分类Dev

ASP.NET身份“基于角色”的声明

来自分类Dev

如何使用ASP.NET MVC进行HTTP调用?

来自分类Dev

使用ASP.NET MVC进行条件格式

Related 相关文章

  1. 1

    使用ASP.NET MVC进行基于声明的授权

  2. 2

    在ASP.Net Identity中使用声明而不是策略进行授权

  3. 3

    使用ASP.net Identity禁用基于角色的授权的MVC视图中的输入字段

  4. 4

    在使用AAD的ASP.NET MVC应用程序中使用目录角色进行授权

  5. 5

    如何在不使用角色的情况下使用ASP.NET WebAPI实现基于声明的授权?

  6. 6

    ASP.NET MVC + API和WCF具有针对自定义数据库和活动目录的基于声明的授权和身份验证

  7. 7

    使用基于ASP.NET身份令牌的身份验证在每个Web Api请求中授权声明

  8. 8

    在ASP.NET MVC 5中使用会话变量进行授权

  9. 9

    搜索具有大量权限的基于声明的授权的最佳实践asp net core?

  10. 10

    使用ASP.NET对纯HTML页面进行授权

  11. 11

    从ASP.Net MVC 6中的OAuth授权服务获取声明

  12. 12

    基于ASP.NET MVC中角色的自定义用户授权

  13. 13

    基于ASP.NET MVC 5中角色的单个页面授权

  14. 14

    具有Azure AD的Asp.net核心基于MVC角色的授权

  15. 15

    基于ASP.NET MVC 5中角色的单个页面授权

  16. 16

    asp.net中基于角色的授权

  17. 17

    使用授权过滤器在asp.net core中实现基于权限的授权

  18. 18

    如何在ASP.Net Core(WebAPI)中基于HTTP谓词和其他属性声明性地指定授权策略

  19. 19

    如何对ASP.NET MVC Web应用程序进行授权的HttpWebRequest

  20. 20

    在ASP.NET MVC中进行用户授权(无需创建表等)的智能方法

  21. 21

    ASP .Net MVC 4授权和AllowAnonymous

  22. 22

    LinqToTwitter用户授权ASP.NET MVC

  23. 23

    ASP.NET MVC和AngularJS授权

  24. 24

    ASP .Net MVC 4授权和AllowAnonymous

  25. 25

    LinqToTwitter用户授权ASP.NET MVC

  26. 26

    如何在ASP.NET Core MVC中基于用户表中的字段添加声明?

  27. 27

    ASP.NET身份“基于角色”的声明

  28. 28

    如何使用ASP.NET MVC进行HTTP调用?

  29. 29

    使用ASP.NET MVC进行条件格式

热门标签

归档