网站搭建实录————建立具有身份验证及功能授权的登录界面
登录界面
- 使用ASP.NET作为服务器代码,使用MVC做服务器代码框架
- 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();
- 其中身份验证和授权是为后续做登录打下基础,静态资源传输是为静态html投递做准备,对于Controller在使用过程中发现MapControllerRoute只会生效他声明过的部分,若要启用所有Controller,必须带上MapControllers,而单独使用MapControllers又会引发没有默认路由,正常网页访问无法返回正确页面的问题,故这两者均要加上
- 网页端cshtml制作,可以通过AI直接完成cshtml部分,只有部分细节需要微调
加密功能
- 对于账号在传递和存储的过程中使用RSA加密,网页端依旧使用AI生成
- 加密逻辑
// 将PEM格式的公钥转换为forge可以理解的格式
var publicKey = forge.pki.publicKeyFromPem(publicKeyPem);
// 使用RSA公钥加密账号
var encryptedAccount = publicKey.encrypt(account, 'RSA-OAEP');
- 解密逻辑
// 定义一个私有方法,用于解密数据
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;
}