Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用私有属性getter(用于密码)在控制器上绑定ASP.NET核心模型_C#_Razor_Asp.net Core Mvc_Private_Model Binding - Fatal编程技术网

C# 使用私有属性getter(用于密码)在控制器上绑定ASP.NET核心模型

C# 使用私有属性getter(用于密码)在控制器上绑定ASP.NET核心模型,c#,razor,asp.net-core-mvc,private,model-binding,C#,Razor,Asp.net Core Mvc,Private,Model Binding,我有一个简单的用户类,对于Password属性,我想使getter私有(仅在内部使用-公开一个公共VerifyPassword方法,该方法将在内部执行验证并返回布尔值) 现在问题来了,我的控制器中的路由上的模型绑定。当我尝试使用asp for标记帮助器指向Model.Password时,它告诉我“由于get访问器不可用,因此无法在此上下文中使用Password” 我是初学者。我认为将getter保密是保护它不被曝光的明智之举。但是现在我不能在模型绑定中使用它 所以有几个问题: 这是保护密码的正确

我有一个简单的用户类,对于Password属性,我想使getter私有(仅在内部使用-公开一个公共VerifyPassword方法,该方法将在内部执行验证并返回布尔值)

现在问题来了,我的控制器中的路由上的模型绑定。当我尝试使用
asp for
标记帮助器指向Model.Password时,它告诉我“由于get访问器不可用,因此无法在此上下文中使用Password”

我是初学者。我认为将getter保密是保护它不被曝光的明智之举。但是现在我不能在模型绑定中使用它

所以有几个问题: 这是保护密码的正确方法吗? 这是使用模型绑定的正确方法吗? 对如何改进这一点有何建议

模型如下:

    using System;

namespace user_signup.Models {
    public class User
    {
        private string username;
        private string email;
        private string password;

        public string Username { 
            get => username;
            set {
                if (value.Length < 5) {
                    throw new ArgumentException("Username is too short.");
                }
                if (value.Length > 15) {
                    throw new ArgumentException("Username is too long.");
                }
                username = value;
            }
        }
        public string Email {
            get => email;
            set {
                // email validation here
                email = value; 
            }
        }

        public string Password {
            // the getter is private (only accessable internally)
            private get => password;
            set {
                if (value.Length < 5) {
                    throw new ArgumentException("Password is too short.");
                } 
                if (value.Length > 15) {
                    throw new ArgumentException("Password is too long.");
                }

                password = value;
            }
        }

        // public means of verifying a password (the password itself is never exposed)
        public bool VerifyPassword(string pass) => Password.Equals(pass);


        // counter of all users that have been instantiated (prevents overlapping IDs)
        // static so it is at the Class level (can be counted globally outside of all User instances)
        private static int NextId = 0;

        // can only be set internally (private setter)
        // defaults to the CURRENT VALUE of NextId and THEN increments NextId for the next instantiation
        public int UserId { get; } = NextId++;

        // can only be set internally (private setter)
        // defaults to current DateTime in string format
        public string CreateDate { get; private set; } = DateTime.Now.ToString(); 

        // the model will be populated from form data sent in a Request
        public User() {}

        // for creating a user by other means (manually)
        public User(string u, string e, string p) {
            Username = u;
            Email = e;
            Password = p;
        }

        public override string ToString() {
            return String.Format(
                "UserId: {0}\nUsername: {1}\nEmail: {2}\n\n",
                UserId,
                Username,
                Email
            );

        }
    }
}
最后是Add.cshtml视图

@using user_signup.Controllers
@model UserController.ViewModel

<!DOCTYPE html>

<html>
<head>
    <title>title</title>
</head>
<body>
<div>
    <form  asp-controller="User" asp-action="Add" method="post">
        <label>Username: </label>
        <input type="text" asp-for="@Model.User.Username" required/>

        <label>Email: </label>
        <input type="text" asp-for="@Model.User.Email"/>

        <label>Password: </label>
        <input type="password" asp-for="@Model.User.Password" required/>

        <label>Verify Password: </label>
        <input type="password" name="verify" required/>

        <input type="submit" value="Sign Up"/>

    </form>
</div>
</body>
</html>
@使用用户注册控制器
@模型UserController.ViewModel
标题
用户名:
电邮:
密码:
验证密码:
  • 不要在数据库中将密码存储为纯文本
  • 用于管理身份验证
  • 不要直接在视图中使用域实体(
    User
    ,在这种情况下),而是使用
    ViewModel
  • 用于验证用户输入的用户
      • 不要在数据库中将密码存储为纯文本
      • 用于管理身份验证
      • 不要直接在视图中使用域实体(
        User
        ,在这种情况下),而是使用
        ViewModel
      • 用于验证用户输入的用户


      公开就行了。出于上述原因,没有必要将其保密。请通读以下内容,了解为什么您希望将某个属性设置为私有:@RichardMc这是在谈论私有setter。我有一个私有的getter,所以密码只能在classI内部读取,我无意争辩。我只是想知道为什么这不是一个好主意,这样我就可以学习了。我的直觉是,对于密码属性,将getter设置为私有将更安全。你能纠正我的直觉让我学习吗?我想你可能对私密的目的有点困惑。您的说法是正确的,它限制了对当前类的访问,但它不会使密码属性更安全,除非您不信任自己的代码。密码安全是指如何存储和传输密码。下面tchelidze概述了如何正确保护密码。这里面有很多东西,但值得知道。把它公之于众吧。出于上述原因,没有必要将其保密。请通读以下内容,了解为什么您希望将某个属性设置为私有:@RichardMc这是在谈论私有setter。我有一个私有的getter,所以密码只能在classI内部读取,我无意争辩。我只是想知道为什么这不是一个好主意,这样我就可以学习了。我的直觉是,对于密码属性,将getter设置为私有将更安全。你能纠正我的直觉让我学习吗?我想你可能对私密的目的有点困惑。您的说法是正确的,它限制了对当前类的访问,但它不会使密码属性更安全,除非您不信任自己的代码。密码安全是指如何存储和传输密码。下面tchelidze概述了如何正确保护密码。这里有很多,但值得知道。谢谢你提供的信息。这些都是我下一步要采取的好步骤。目前,我只是在练习将数据绑定到模型。不幸的是,ms文档对于模型绑定来说非常复杂和混乱,没有必要使用
      私有
      属性,
      视图模型
      将数据从浏览器传输到控制器。您能否详细说明为什么使用视图模型而不是实体?我所遵循的教程说,将用户作为路由处理程序的参数,以便“表单数据的模型绑定”可以occur@vampiire当然,看看我看到的另一种选择,就是在控制器中接收表单输入,在处理程序体中手动填充模型的句柄。这似乎是更正确的方法吗?谢谢你提供的信息。这些都是我下一步要采取的好步骤。目前,我只是在练习将数据绑定到模型。不幸的是,ms文档对于模型绑定来说非常复杂和混乱,没有必要使用
      私有
      属性,
      视图模型
      将数据从浏览器传输到控制器。您能否详细说明为什么使用视图模型而不是实体?我所遵循的教程说,将用户作为路由处理程序的参数,以便“表单数据的模型绑定”可以occur@vampiire当然,看看我看到的另一种选择,就是在控制器中接收表单输入,在处理程序体中手动填充模型的句柄。这似乎是更正确的方法吗?
      @using user_signup.Controllers
      @model UserController.ViewModel
      
      <!DOCTYPE html>
      
      <html>
      <head>
          <title>title</title>
      </head>
      <body>
      <div>
          <form  asp-controller="User" asp-action="Add" method="post">
              <label>Username: </label>
              <input type="text" asp-for="@Model.User.Username" required/>
      
              <label>Email: </label>
              <input type="text" asp-for="@Model.User.Email"/>
      
              <label>Password: </label>
              <input type="password" asp-for="@Model.User.Password" required/>
      
              <label>Verify Password: </label>
              <input type="password" name="verify" required/>
      
              <input type="submit" value="Sign Up"/>
      
          </form>
      </div>
      </body>
      </html>