硬编码用户名和密码的替代方法

时间:2013-04-25 15:52:20

标签: asp.net-mvc html5 security razor

我正在使用C#Razor编写一个MVC4应用程序以及所有非常棒的东西。它具有完整的登录名和密码以及用户登录前需要的额外2个问题。

在我几个月前启用登录功能之前,这是一个梦想,我只是在我感兴趣的页面上启动应用程序,然后加载即可让我立即看到我的结果。

偶尔我会从错误的页面开始,上帝禁止我可能需要额外点击一两次才能到达正确的页面。我认为这很糟糕。

现在我已经启用了登录,并且自从对代码进行了多次修改后,它已经通过了测试部门,并且已经进入了一个糟糕的世界。我不允许再次禁用它。

我的替代方案是基本上硬编码测试用户名和密码并使用所需的其他默认值固定,然后在发布时删除它们。感谢上帝的测试...我实际上把它们硬编了一次。这足以告诉我从不再做的教训。

然而,我开始毫不夸张地开始我的应用程序,可能每天都有数百次(尽管感觉好像数千次),每次我都要填写这个可怕的登录表单。这非常没有效果,真的耗费了我很多时间。它积极地鼓励我做一次糟糕的编程习惯,一次改变几件事,然后进行测试。一条我不想开始的道路。

我的问题:是否有替代这种硬编码的做法可以让我恢复生产力?

请不要建议允许浏览器记住详细信息。我试过,问题是我的应用程序必须跨浏览器和平台兼容,这意味着它不仅必须在Windows浏览器中运行(它本身有足够的变化),而且还在平板电脑,手机甚至是lunix和macs上运行。因此,依靠浏览器来记住细节根本不是一种选择。

任何建议。

根据以下建议,我决定探索web / user.config路由,这是我到目前为止的尝试,但是没有用。

型号:

public class LogOnModel
{
    [Required]
    [Display(Name = "User name")]
    [StringLength(255, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 8)]
    public string UserName { get; set; }

    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    [StringLength(255, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
    public string Password { get; set; }
}

控制器:

    public ActionResult Login()
    {
        LogOnModel model = new LogOnModel(); 
        model.UserName = ConfigurationManager.AppSettings["UserName"];
        model.Password = ConfigurationManager.AppSettings["Password"];

        return View("Login");
    }


    [HttpPost]
    public ActionResult Login(LogOnModel model, string returnUrl)
    {
        model.UserName = ConfigurationManager.AppSettings["UserName"];
        model.Password = ConfigurationManager.AppSettings["Password"];
        //I am aware that this will presently overwrite the incoming model if it exists.
        //I am just trying to get something work here and I will surround it with an if afterward.

        if (ModelState.IsValid)
        {
          ... Other code here
        }
          ... Other code here (there are a variety of returns this is a long method with lots of checks
    }

查看:

@model YeatsClinical.PatientPortal.Web.Models.LogOnModel

...Lots of other code...
@Html.TextBoxFor(x=>x.UserName,  new { @class = "m-wrap placeholder-no-fix", @placeholder="Username"})
...Lots of other code...
I didn't bother trying the password yet, I just wanted to get one thing working first.

Web.Config中:

<appSettings file="user.config">

User.Config

<appSettings>
    <add key="UserName" value ="someone@somewhere.com"/>
    <add key="Password" value ="password"/>
</appSettings>

不再有任何web / user.config错误或任何构建错误。它只是像以前一样加载带有占位符文本的格式良好的文本框。那我哪里错了。再次感谢大家。

1 个答案:

答案 0 :(得分:3)

将您的登录详细信息放在本地web.config文件中。您的代码将查找配置值,如果有,将自动填充它们。您可以在部署时保留此代码 - 因为这些值不在生产中的配置文件中,您不必担心它在那里运行。

或者您可以将它们放在单独的配置文件中,例如user.config,并在主配置中引用它。您的user.config文件永远不会发布。只需确保您的部署实践不会带来此文件。

的Web.config:

<configuration>
  <appSettings file="user.config">
    <!-- put your normal config values here -->
  </appSettings>
</configuration>

user.config(仅限本地计算机 - 不在源代码管理中,不在服务器上)

<appSettings>
  <add key="defaultUser" value ="someUser"/>
  <add key="defaultPassword" value ="somePassword"/>
</appSettings>

另一种选择可能是使用条件编译,假设您在本地处于调试模式并在发布模式下发布。

#if DEBUG
    PopulateTheUserCredentials();
#endif