Asp.net core mvc 添加没有完整用户管理的管理页面

Asp.net core mvc 添加没有完整用户管理的管理页面,asp.net-core-mvc,user-management,Asp.net Core Mvc,User Management,我正在用ASP.NET核心MVC 2.0构建一个相当简单的网站,它或多或少是一个图像库,只适合我。到目前为止,我没有使用任何数据库。它只是一个包含元数据和图像文件本身的json文件 现在这个网站应该有一个隐藏的管理页面,我(只有我)可以上传新图片 什么是一种简单但仍然安全的方法来添加此管理员页面,而不必向站点引入全面的用户管理?我想避免添加数据库和实体框架等网站-将只有一个用户 换句话说,在只有一个用户进行身份验证的情况下,添加用户管理的安全而简单的方法是什么?我是管理员。将所需用户名/密码的哈

我正在用ASP.NET核心MVC 2.0构建一个相当简单的网站,它或多或少是一个图像库,只适合我。到目前为止,我没有使用任何数据库。它只是一个包含元数据和图像文件本身的json文件

现在这个网站应该有一个隐藏的管理页面,我(只有我)可以上传新图片

什么是一种简单但仍然安全的方法来添加此管理员页面,而不必向站点引入全面的用户管理?我想避免添加数据库和实体框架等网站-将只有一个用户


换句话说,在只有一个用户进行身份验证的情况下,添加用户管理的安全而简单的方法是什么?我是管理员。

将所需用户名/密码的哈希版本存储在appsettings.json中,然后重新刷新通过登录屏幕提供的值并进行比较

下面是一个如何完成登录的示例。这将引导Asp.Net Identity中的默认哈希程序,但您可以使用任何哈希函数

如果您想从应用程序中重置哈希密码,而不必进入设置文件,您可能还需要创建一些其他帮助程序

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>>();
    ...
 }
public class LoginCredentialOptions
{
    public string UsernameHash { get; set; }

    public string PasswordHash { get; set; }
}
...
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);
}
AccountController.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>>();
    ...
 }
public class LoginCredentialOptions
{
    public string UsernameHash { get; set; }

    public string PasswordHash { get; set; }
}
...
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);
}
。。。
公共异步任务登录([FromServices]IOptions loginCreds,LoginViewModel模型,字符串returnUrl=null)
{
if(ModelState.IsValid)
{
var passwordResult=passwordHasher.VerifyHashedPassword(null,loginCreds.Value.PasswordHash,model.Password);
var usernamesult=passwordHasher.VerifyHashedPassword(null,loginCreds.Value.usernameshash,model.Username);
if(passwordResult==PasswordVerificationResult.Success&&
usernameResult==PasswordVerificationResult.Success)
{
//创建身份cookie并登录
重定向到操作(名称(索引),“主页”);
}
}
//如果我们走到这一步,有些东西失败了,重新显示形式
返回视图(模型);
}

如果强大的安全性可以变得更简单,那么它已经是这样了。更简单的安全方法必须接受更高级别的风险。你能澄清一下你愿意接受什么样的风险吗?我不愿意接受任何风险。我只是想知道,如果总是只有一个用户,是否可以进行任何简化。如果我只有一个用户名和一个密码散列要存储,那么引入EF感觉有点奇怪。也许应用程序机密可以用于此?core中的应用程序机密在任何方面都不安全。它们只是为了避免源代码管理中的机密看起来不错,我只需要找到一个更好的地方来检索用户机密,而不是从appsettings.json检索。它们可能不应该存储在那里。这可能会决定我将在哪里托管应用程序,在Azure上我可以使用Key Vault。因为它们是散列,所以可以将它们存储在appsettings中。如果您要使用azure key vault,则没有必要对它们进行散列。