ASP.NET系统中如何实现软件加密、授权

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ASP.NET系统中如何实现软件加密、授权相关的知识,希望对你有一定的参考价值。

安装系统的时候获取cpu 和网卡号 形成注册号
写到注册表中

安装完成后要求输入注册号,把输入的值存放到某个文件(比如xml文件中),如果错误要提示

void Application_Start(object sender, EventArgs e)
application变量
在系统启动的时候就读取写在注册表中的key和xml文件中保存的序列号 不同则提示 并退出
参考技术A 请问是加密一个特点网站的web.config文件的同用形式吗?
如果是 加密代码入下
aspnet_regiis.exe -pef 要加密的配置节(web.config里的像appsettings这样的) 你的项目路径 -prov provider
解密和这差不多

授权:
<authorization>
<deny user="?"><!--拒绝匿名用户-->
<allow roles="admin"><!--允许管理员角色-->
<authorization>

如何使用 Web Api Asp.Net Core 实现基于声明的授权?

【中文标题】如何使用 Web Api Asp.Net Core 实现基于声明的授权?【英文标题】:How to implement Claim based authorization using Web Api Asp.Net Core? 【发布时间】:2020-11-16 16:05:48 【问题描述】:

我正在使用 Web API 并在登录时生成 JWT 令牌。我对用户角色和声明有非常复杂的要求。一个用户可以有多个角色。一个角色可以有多个声明,而一个用户可以有特定的声明。我正在使用 Asp.Net Core Identity。一个用户可以在 AspNetUserClaims 中拥有数据,同一用户可以拥有不同的角色,并且每个角色在 AspRoleClaims 中都有声明。我已经使用 web api 成功实现了基于角色的授权,但是如何在 web API 中实现基于声明的授权?

我已经实现但不太喜欢的一件事是,我将所有用户声明(包括角色中的声明)存储在 JWT 令牌中,并且在每个请求中,我都从 JWT 中提取声明。但这是否是最佳实践 - 在 JWT 令牌中存储大数据?

或者在 Web API Dot Net 核心中进行基于声明的授权的其他方法是什么?

【问题讨论】:

【参考方案1】:

您可以像这样创建自定义策略,您可以拥有多个单独的策略并将它们与授权标签堆叠在一起,或者您可以使用一个处理程序来处理多个策略,或者在一个策略中您可以在 policyBuilder(我喜欢这种方法用于很多用例)。请参阅下面的信息和微软链接

注册自定义策略的示例:

Startup.cs

 services.AddAuthorization(authorizationOptions =>
 
    authorizationOptions.AddPolicy(
    "MustBeBornInSummer",
    policyBuilder =>
    
       //add any other policy requirements here too including ones by default
       //eg policyBuilder.RequireAuthenticatedUser();
        policyBuilder.AddRequirements(
            new MustBeBornInSummerRequirement()
            //, new AnotherRequirement()
            );
    );
    //only if you want to register as the default policy
    authorizationOptions.DefaultPolicy = authorizationOptions.GetPolicy("MustBeBornInSummer");
);

然后在授权中

你使用的标签

[Authorize("MustBeBornInSummer")]

您可以设置默认策略,允许您正常使用授权标签

authorizationOptions.DefaultPolicy = authorizationOptions.GetPolicy("MustBeBornInSummer");

您的需求类别

public class MustBeBornInSummerRequirement : IAuthorizationRequirement
    
        public MustBeBornInSummerRequirement ()
        
        
    

处理程序类

 public class MustBeBornInSummerHandler: AuthorizationHandler<MustBeBornInSummerRequirement>
    

        public MustBeBornInSummerHandler ()
        
            //your dependency injections
        

        protected override Task HandleRequirementAsync(
            AuthorizationHandlerContext context, 
            MustBeBornInSummer requirement)
          
//Get the claim you want
            var subject = context.User.Claims.FirstOrDefault(c => c.Type == "sub")?.Value;

            var dateOfBirth = _useryRepository.GetApplicationUserProfile(subject)?.dob;


           //your logic`check user claims then do stuff, or/and check roles too
            if (!bornInSummer)
            
                context.Fail();
                return Task.CompletedTask;
            


            // has claims
            context.Succeed(requirement);
            return Task.CompletedTask;
        
    

在你的配置服务中你需要注册它:

services.AddScoped<IAuthorizationHandler, MustBeBornInSummerHandler>();

您也可以拥有一个处理多个需求的处理程序

public class PermissionHandler : IAuthorizationHandler

    public Task HandleAsync(AuthorizationHandlerContext context)
    
        var pendingRequirements = context.PendingRequirements.ToList();
        foreach (var requirement in pendingRequirements)
        
          if(requirementMustBeBornInSummer
             //Dostuff continue
          elseIf(requirementIsBlah)
        
    

如何处理索赔由你决定,这是我通常的做法

var subject = context.User.Claims.FirstOrDefault(c => c.Type == "sub")?.Value;

var dateOfBirth = _useryRepository.GetApplicationUserProfile(subject)?.dob;


//My repository
public ApplicationUserProfile GetApplicationUserProfile(string subject)

    return _context.ApplicationUserProfiles.FirstOrDefault(a => a.Subject == subject);

您还可以拥有单独的策略并将它们堆叠起来

[Authorize(Policy = "MustBeBornInSummer")]
[Authorize(Policy = "readRole")]

https://docs.microsoft.com/en-us/aspnet/core/security/authorization/policies?view=aspnetcore-3.1

至于在 JWT 中存储大量数据,对于特定于应用程序的声明,我通常会创建一个表来存储特定应用中用户的声明。然后我使用令牌的“子”来查找用户拥有的声明。这使您无需返回非常大的令牌。

【讨论】:

我们如何在索赔中添加政策? 我不确定你在问什么?如果是关于在哪里存储声明,我刚刚更新了我的答案 我正在使用 asp.net 身份核心。 智威汤逊如何授权策略或者我对此没有明确的概念 在第一个代码块中,我在启动时注册了策略,如果我没有将其设置为默认策略,那么每当我想要使用该策略时,我都会使用以下 [Authorize(Policy = "MustBeBornInSummer ")]`` 在我的控制器中。您的处理程序决定是否满足政策条件。如果政策条件不满足,您可以通过context.Fail(); return Task.CompletedTask;context.Succeed(requirement); return Task.CompletedTask; 如果条件满足

以上是关于ASP.NET系统中如何实现软件加密、授权的主要内容,如果未能解决你的问题,请参考以下文章

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

如何使用asp.net编写酒店管理系统

ASP.NET Core WebApi Jwt 基于角色的授权不起作用

ASP.NET MVC - 动态授权

如何使用基于声明的授权保护 asp.net core 2.1 中的静态文件夹

Jwt 和 ASP.NET CORE 授权 AspNetRoleClaims