我正在使用ASP.NET Core MVC 2.0构建一个相当简单的站点,它或多或少是一个图像库,仅供我使用。到目前为止我没有使用任何数据库。它只是一个包含元数据和图像文件的json文件。
现在这个网站应该有一个隐藏的管理页面,我(只有我)可以上传新图片。
在不必向网站引入完整的用户管理的情况下,添加此管理页面的简单但仍然安全的方法是什么?我想避免向网站添加数据库和实体框架等 - 只有一个用户。
换句话说,在只有一个用户进行身份验证的情况下,添加用户管理的安全且简单的方法是什么:我,管理员。
答案 0 :(得分:1)
在appsettings.json中存储所需用户名/密码的散列版本,然后重新扫描通过登录屏幕提供的值并进行比较。
以下是如何完成登录的示例。这引导了Asp.Net Identity中存在的默认hasher,但您可以使用任何散列函数。
如果您想从应用程序重置哈希密码而不必进入设置文件,您可能还想创建一些其他帮助程序。
<强> appsettings.json 强>
{
...
"LoginCredentials": {
"UsernameHash": "AQAAAAEAACcQAAAAENmv+riLvtTIa5wafXxzEX4rMSMXwVzG00q4jZKBI7Lx/oe2PFdqW1r521HBsL567g==",
"PasswordHash": "AQAAAAEAACcQAAAAEKwwppiixEQM9QO7hOXcoXXgIvHKs9QHRz1k0lAZ3noVwID2lv+I+Dwc9OheqDGFBA=="
}
}
<强> Startup.cs 强>
public void ConfigureServices(IServiceCollection services)
{
//Assuming services.AddIdentity<...>(...) is not added as a service
services.Configure<LoginCredentialOptions>(Configuration.GetSection("LoginCredentials"));
services.AddTransient<IPasswordHasher<User>, PasswordHasher<User>>();
...
}
<强> LoginCredentialOptions.cs 强>
public class LoginCredentialOptions
{
public string UsernameHash { get; set; }
public string PasswordHash { get; set; }
}
<强> AccountController.cs 强>
...
public async Task<IActionResult> Login([FromServices] IOptions<LoginCredentialOptions> loginCreds, LoginViewModel model, string returnUrl = null)
{
if (ModelState.IsValid)
{
var passwordResult = passwordHasher.VerifyHashedPassword(null, loginCreds.Value.PasswordHash, model.Password);
var usernameResult = passwordHasher.VerifyHashedPassword(null, loginCreds.Value.UsernameHash, model.Username);
if (passwordResult == PasswordVerificationResult.Success &&
usernameResult == PasswordVerificationResult.Success)
{
//Create identity cookie and sign in
RedirectToAction(nameof(Index), "Home");
}
}
// If we got this far, something failed, redisplay form
return View(model);
}