【问题标题】:Add admin page without full fledged user management添加没有完整用户管理的管理页面
【发布时间】:2017-09-17 05:12:53
【问题描述】:

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

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

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

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

【问题讨论】:

  • 如果强大的安全性可以变得更简单,那么它已经是那样了。更简单的安全方法必须接受更高级别的风险。你能澄清一下你愿意接受什么样的风险吗?
  • 我不愿意接受任何风险。我只想知道如果始终只有一个用户,是否可以进行任何简化。如果我只有一个用户名和一个密码哈希来存储,那么引入 EF 会感觉很奇怪。也许应用程序机密可以用于此目的?
  • 核心中的应用程序机密无论如何都不安全。他们只是为了避免源代码管理中的秘密

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


【解决方案1】:

将所需用户名/密码的散列版本存储在 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>>();
    ...
 }

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

【讨论】:

  • 这看起来不错,我只需要找到一个比 appsettings.json 更好的地方来检索用户机密,它们可能不应该存储在那里。这可能取决于我将在哪里托管应用程序,在 Azure 上我可以使用 Key Vault。
  • 由于它们是哈希值,您可以将它们存储在 appsettings 中。如果你打算使用 azure key vault,那么散列它们是没有意义的。
猜你喜欢
  • 1970-01-01
  • 2018-05-11
  • 2013-10-09
  • 1970-01-01
  • 1970-01-01
  • 2021-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多