添加管理页面没有完全成熟的用户管理

时间:2017-09-13 21:45:28

标签: asp.net-core-mvc user-management

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

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

在不必向网站引入完整的用户管理的情况下,添加此管理页面的简单但仍然安全的方法是什么?我想避免向网站添加数据库和实体框架等 - 只有一个用户。

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

1 个答案:

答案 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);
}