网站搭建实录-1


网站搭建实录-1

网站搭建实录————建立具有身份验证及功能授权的登录界面

登录界面

  1. 使用ASP.NET作为服务器代码,使用MVC做服务器代码框架
  2. Program.cs中需要引入的功能
    var builder = WebApplication.CreateBuilder(args);
    //添加log
    builder.Services.AddHttpLogging();
    builder.Logging.AddConsole();
    //添加身份验证
    builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(option =>
    {
        option.LoginPath = "/Login";
    });
    //添加授权权限
    builder.Services.AddAuthorization(options =>
    {
        options.AddPolicy("RequireAdministratorRole",
            policy => policy.RequireRole("Administrator"));
    });
    // Add services to the container.
    //添加带视图的MVC控制器服务
    builder.Services.AddControllersWithViews();

    var app = builder.Build();

    // Configure the HTTP request pipeline.
    if (!app.Environment.IsDevelopment())
    {
        app.UseExceptionHandler("/Home/Error");
        // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
        app.UseHsts();
    }
    app.UseHttpLogging();
    //重定向Http到Https
    //app.UseHttpsRedirection();
    app.UseRouting();
    //启用身份验证
    app.UseAuthentication();
    //启用授权
    app.UseAuthorization();
    //启用静态资源传输
    app.MapStaticAssets();

    //引用所有Controller路由
    app.MapControllers(); 
    //启用/Login作为默认路由
    app.MapControllerRoute(
        name: "default",
        pattern: "{controller=Login}/{action=Index}/{id?}")
        .WithStaticAssets();

    app.Run();
  1. 其中身份验证和授权是为后续做登录打下基础,静态资源传输是为静态html投递做准备,对于Controller在使用过程中发现MapControllerRoute只会生效他声明过的部分,若要启用所有Controller,必须带上MapControllers,而单独使用MapControllers又会引发没有默认路由,正常网页访问无法返回正确页面的问题,故这两者均要加上
  2. 网页端cshtml制作,可以通过AI直接完成cshtml部分,只有部分细节需要微调

加密功能

  1. 对于账号在传递和存储的过程中使用RSA加密,网页端依旧使用AI生成
  2. 加密逻辑
    // 将PEM格式的公钥转换为forge可以理解的格式
    var publicKey = forge.pki.publicKeyFromPem(publicKeyPem);

    // 使用RSA公钥加密账号
    var encryptedAccount = publicKey.encrypt(account, 'RSA-OAEP');
  1. 解密逻辑
    // 定义一个私有方法,用于解密数据
    private byte[] Decrypt(string encryptedData)
    {
        // 将Base64编码的字符串转换为字节数组
        byte[] encryptedBytes = Convert.FromBase64String(encryptedData);

        // 从指定的文件中读取私钥
        // 使用BouncyCastle从PEM文件中读取私钥
        string privateKey = System.IO.File.ReadAllText("G:\\save\\private.pem");
        AsymmetricCipherKeyPair keyPair;
        using (var reader = new StringReader(privateKey))
        {
            // 使用PemReader读取私钥对象
            var pemReader = new PemReader(reader);
            var keyPairObject = pemReader.ReadObject();
            // 检查读取的对象是否为AsymmetricCipherKeyPair类型
            if (keyPairObject is AsymmetricCipherKeyPair keyPairObj)
            {
                keyPair = keyPairObj;
            }
            else
            {
                // 如果不是,则抛出异常
                throw new ArgumentException("Invalid private key format");
            }
        }

        // 从keyPair中提取私钥参数
        var privateKeyParam = (RsaPrivateCrtKeyParameters)keyPair.Private;
        // 创建RSA加密引擎
        var rsaEngine = new RsaEngine();
        // 匹配客户端加密填充模式,创建OAEP编码引擎,使用SHA-1作为哈希函数和掩码生成函数
        var oaepEngine = new OaepEncoding(rsaEngine, new Sha1Digest(), new Sha1Digest(), null);
        // 初始化OAEP编码引擎进行解密操作
        oaepEngine.Init(false, privateKeyParam);
        // 使用OAEP编码引擎解密数据
        byte[] decryptedBytes = oaepEngine.ProcessBlock(encryptedBytes, 0, encryptedBytes.Length);

        // 返回解密后的字节数组
        return decryptedBytes;
    }


已发布

分类

来自

标签: