带有基于权限的身份验证的.NET Core Identity API

南非

我是Identity API的新手,但在我的Web应用程序中:机构用户为自己的机构创建了其他用户,他们想确定是否看到此页面。我的控制器方法如下;

    [Authorize]
    public IActionResult Privacy()
    {
        return View();
    }

但用户也有权执行任何操作,例如此枚举,并且枚举大于50;

    public enum PermissionTypes
    {
        UserCreate = 1,
        UserEdit = 2,
        UserDelete = 3,
        ....
    }

我进行了一些研究并发现了基于策略的授权,但是当您创建新策略时,必须在Startup.cs上声明,这对我不利,因为这样做时,您总是在生产中发布新代码。我需要的是这样的东西;

    [CustomAuth(PermissionTypes.UserCreate)]
    public IActionResult Privacy()
    {
        return View();
    }

有什么解决方案吗?

乔纳森·阿尔法罗

有很多方法可以做到这一点。很多人推荐基于声明和基于策略的安全性...我个人发现此方法有些“僵硬”。

所以我做了一些不同的事情:

首先创建一个这样的类:

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Authorization.Infrastructure;
using Microsoft.AspNetCore.Identity;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;

namespace Bamboo.Web.CoreWebsite.Membership
{
  public class PermissionHandler : AuthorizationHandler<RolesAuthorizationRequirement>
  {
    private readonly IUserStore<CustomUser> _userStore;        

    public PermissionHandler(IUserStore<CustomeUser> userStore)
    {
      _userStore = userStore;         
    }

    protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, RolesAuthorizationRequirement requirement)
    {
      if(context == null || context.User == null)
        return;

      var userId = context.User.FindFirst(c => string.CompareOrdinal(c.Type, ClaimTypes.NameIdentifier) == 0);//according to msdn this method returns null if not found

      if(userId == null)
        return;

      // for simplicity, I use only one role at a time in the attribute
      //but you can use multiple values
      var permissions = requirement.AllowedRoles.ToList();

      var hasPermissions = //here is your logic to check the database for the actual permissions for this user.
                           // hasPermissions is just a boolean which is the result of your logic....

      if(hasPermissions)
        context.Succeed(requirement);//the user met your custom criteria
      else
        context.Fail();//the user lacks permissions.
    }
  }
}

现在将PermissionHandler注入您的startup.cs文件中,如下所示:

    public void ConfigureServices(IServiceCollection services)
    {
          // Custom Identity Services
          ........

          // custom role checks, to check the roles in DB 
          services.AddScoped<IAuthorizationHandler, PermissionHandler>();

//the rest of your injection logic omitted for brevity.......
    }

现在在您的操作中使用它:

[Authorize(Roles = PermissionTypes.UserCreate)]
public IActionResult Privacy()
{
   return View();
}

注意,我没有创建自定义属性...就像我说的,有很多方法可以做到这一点。我更喜欢这种方式,因为它减少了代码,并且没有硬编码的策略或声明或任何其他复杂性,您可以使其成为100%由数据驱动的。

这是一个复杂的主题,因此可能需要对其进行一些额外的调整。

另外,我使用的ASP.NET Core 2.2可能不同于3.0。

但是它应该为您提供一种基于权限的授权方式。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用ASP.NET Identity和ASP.NET Web API 2的基于跨域令牌的身份验证

来自分类Dev

结合使用.NET Core Identity和API

来自分类Dev

.NET Core API中的Windows身份验证自动登录

来自分类Dev

.Net Core Web API的Auth0身份验证

来自分类Dev

如何使用 Identity & Entity Framework 在 .NET Core 2.0 中管理身份验证和授权

来自分类Dev

使用 Asp.net Core 2.1 和 Identity Server 4 的身份验证/授权

来自分类Dev

ASP。带有Cookie身份验证的Net Core 2.2:未经API专用控制器授权时,如何避免页面重定向

来自分类Dev

如何在带有Servicestack的.NET Core中使用Windows身份验证登录

来自分类Dev

带有.NET Web API的AngularJS:使用AD进行身份验证

来自分类Dev

带有OWIN的ASP.NET Web Api-自定义身份验证

来自分类Dev

OAuth:ASP.NET Web API User.Identity不加载身份验证令牌提供者设置的声明

来自分类Dev

.NET Core Web Api Azure AD和Swagger不进行身份验证

来自分类Dev

在.NET Core Web API中使用自定义属性进行JWT身份验证

来自分类Dev

.Net Core Web API基本身份验证授权不适用于Azure

来自分类Dev

ASP.NET Core API / Angular-身份验证问题

来自分类Dev

如何使用Postman使用Cookie身份验证测试ASP.NET Core Web API?

来自分类Dev

静态文件 - asp.net web api core 2.1 身份验证方案承载

来自分类Dev

Web 应用程序和 API AzureAD 身份验证流程 ASP.NET Core

来自分类Dev

使用 ASP.NET Core Web API 的 Facebook JWT 身份验证

来自分类Dev

响应 JWT 错误的身份验证 Asp.Net Core Web Api

来自分类Dev

当使用ASP.NET Core Web API中没有身份的cookie身份验证时,如何在登录时刷新CSRF令牌

来自分类Dev

具有基于自定义角色的授权的ASP.Net Core 3.0 Windows身份验证

来自分类Dev

使用运行Identity Server 4的ASP.NET CORE 3身份验证服务器对ASP.NET MVC 5应用(目标.net 4.5)进行身份验证

来自分类Dev

.NET Core令牌身份验证-主体

来自分类Dev

.Net Core HttpClient摘要身份验证

来自分类Dev

将Windows身份验证与带有ASP.NET Core的Azure Service Fabric一起使用

来自分类Dev

.Net Identity 和 .Net Core Identity 散列算法的区别

来自分类Dev

带有身份验证令牌的提琴手multipart / form-data asp.net Web API 2

来自分类Dev

带有身份验证令牌的Fiddler multipart / form-data asp.net Web API 2

Related 相关文章

  1. 1

    使用ASP.NET Identity和ASP.NET Web API 2的基于跨域令牌的身份验证

  2. 2

    结合使用.NET Core Identity和API

  3. 3

    .NET Core API中的Windows身份验证自动登录

  4. 4

    .Net Core Web API的Auth0身份验证

  5. 5

    如何使用 Identity & Entity Framework 在 .NET Core 2.0 中管理身份验证和授权

  6. 6

    使用 Asp.net Core 2.1 和 Identity Server 4 的身份验证/授权

  7. 7

    ASP。带有Cookie身份验证的Net Core 2.2:未经API专用控制器授权时,如何避免页面重定向

  8. 8

    如何在带有Servicestack的.NET Core中使用Windows身份验证登录

  9. 9

    带有.NET Web API的AngularJS:使用AD进行身份验证

  10. 10

    带有OWIN的ASP.NET Web Api-自定义身份验证

  11. 11

    OAuth:ASP.NET Web API User.Identity不加载身份验证令牌提供者设置的声明

  12. 12

    .NET Core Web Api Azure AD和Swagger不进行身份验证

  13. 13

    在.NET Core Web API中使用自定义属性进行JWT身份验证

  14. 14

    .Net Core Web API基本身份验证授权不适用于Azure

  15. 15

    ASP.NET Core API / Angular-身份验证问题

  16. 16

    如何使用Postman使用Cookie身份验证测试ASP.NET Core Web API?

  17. 17

    静态文件 - asp.net web api core 2.1 身份验证方案承载

  18. 18

    Web 应用程序和 API AzureAD 身份验证流程 ASP.NET Core

  19. 19

    使用 ASP.NET Core Web API 的 Facebook JWT 身份验证

  20. 20

    响应 JWT 错误的身份验证 Asp.Net Core Web Api

  21. 21

    当使用ASP.NET Core Web API中没有身份的cookie身份验证时,如何在登录时刷新CSRF令牌

  22. 22

    具有基于自定义角色的授权的ASP.Net Core 3.0 Windows身份验证

  23. 23

    使用运行Identity Server 4的ASP.NET CORE 3身份验证服务器对ASP.NET MVC 5应用(目标.net 4.5)进行身份验证

  24. 24

    .NET Core令牌身份验证-主体

  25. 25

    .Net Core HttpClient摘要身份验证

  26. 26

    将Windows身份验证与带有ASP.NET Core的Azure Service Fabric一起使用

  27. 27

    .Net Identity 和 .Net Core Identity 散列算法的区别

  28. 28

    带有身份验证令牌的提琴手multipart / form-data asp.net Web API 2

  29. 29

    带有身份验证令牌的Fiddler multipart / form-data asp.net Web API 2

热门标签

归档