【问题标题】:MVC 5 ASP.Net FORM submit() function not workingMVC 5 ASP.Net FORM submit() 函数不起作用
【发布时间】:2016-01-19 19:06:00
【问题描述】:

我正在尝试使用以下方法获取登录表单。我正在使用 JQuery 版本 1.12.0 和 MVC5。我只是创建了一个帐户控制器,当管理员登录时,他/她可以执行 CRUD 功能,其他用户只能看到帖子和 cmets 等等,但是登录页面不起作用意味着当我按下登录时没有任何反应。页面不刷新。它的行为就像我没有点击一样 这是登录视图

@model string

@{
  ViewBag.Title = "Login";
 }

 @section ExtraHeaders
  {
  <script src="@Url.Content("~/Scripts/Login.js")" type="text/javascript</script>
<script src="@Url.Content("~/Scripts/SHA256.js")" type="text/javascript</script>
 }

 <form action="@Href("~/Accounts/Login")" method="post" id="loginForm">
  <input type="text" name="name" id="name"/> Name <br />
  <input type="password" name="password" id="password"/> Password <br />
  <input type="hidden"  name="nonce" id="nonce" value="@Model"/>
  <input type="hidden"  name="hash" id="hash" value="hash"/>
  <input type="button" onclick="getPasswordHash('password', 'nonce','hash'); $('#loginForm').submit();" value="Login"/>
 </form>

这是登录js文件代码

function getPasswordHash (passwordElement, nonceElement, hashElement)
{
   var password = $('#' + passwordElement).attr('value');
  var nonce = $('#' + nonceElement).attr('value');
  $('#' + hashElement).attr('value', $.sha256(password + nonce));
  $('#' + passwordElement).attr('value', '');

 }

这是用于登录的帐户控制器

private BlogModel model= new BlogModel();

    public ActionResult Login(string name, string hash)
    {
        if(string.IsNullOrWhiteSpace(hash))

        {
            Random random = new Random();
            byte[] randomData = new byte[sizeof(long)];
            random.NextBytes(randomData);
            string newNonce = BitConverter.ToInt64(randomData, 0).ToString("X16");
            Session["Nonce"] = newNonce;
            return View(model: newNonce);

        }

        Administrator admin = model.Administrators.Where(x => x.Name == name).FirstOrDefault();
        string nonce = Session["Nonce"] as string;
        if(admin == null || string.IsNullOrWhiteSpace(nonce))
        {
            return RedirectToAction("Index", "Posts");

        }
        string computedHash;
        using (SHA256 sha256 = SHA256.Create()) //sha256
        {
            byte[] hashInput = Encoding.ASCII.GetBytes(admin.Password + nonce);
            byte[] hashData = sha256.ComputeHash(hashInput);
            StringBuilder stringBuidler= new StringBuilder();
            foreach(byte value in hashData)
            {
                stringBuidler.AppendFormat("{0:X2}", value);

            }
            computedHash = stringBuidler.ToString();

        }
        Session ["IsAdmin"]= (computedHash.ToLower() == hash.ToLower());
        return RedirectToAction("Index","Posts");
    }


    public ActionResult Logout()
    {
        Session["Nonce"] = null;
        Session["IsAdmin"] = null;
        return RedirectToAction("Index", "Posts");

    }
    public ActionResult Index()
    {
        return View();
    }

编辑:当我右键单击它的定义时,它告诉我“失败” 要么是因为插入符号已经在定义中,要么是因为找不到显式定义

【问题讨论】:

  • 你为什么首先计算一个哈希客户端?为什么不直接取出 JavaScript 并使用普通的submit 按钮?
  • 先生,我是初学者,正在观看视频进行练习。任何帮助将不胜感激提前感谢

标签: javascript c# jquery asp.net-mvc login


【解决方案1】:

使用 HTTP post 属性装饰您的操作方法

 [HttpPost]
 public ActionResult Login(string name, string hash)
 {
 }

Http get and post more info

【讨论】:

  • 这会有什么不同?所有这一切都是restrict 动词到POST,但首先要使用POST,这并不是必需的。非属性修饰的操作方法仍然接受POST 请求。
【解决方案2】:

最简单的方法是首先不使用该 JavaScript。它没有完成任何事情,因为无论如何您都有服务器端代码来计算哈希。它甚至可能存在安全风险,因为它会将哈希计算(包括您使用的任何盐)暴露给任何想查看它的人。

只需将其完全删除并使用正常的提交按钮:

<input type="submit" value="Login"/>

当然,还要去掉这一行:

<input type="hidden"  name="hash" id="hash" value="hash"/>

并从action方法中移除hash参数:

public ActionResult Login(string name)

您可能还可以删除更多内容。例如,“nonce”元素和首先传递给视图的相应模型。 (看起来确实有很多与功能有关的活动部件,一开始就不应该存在。)


虽然 清楚的是为什么您的操作方法不接受 密码 作为参数?通常,登录表单涉及检查密码...

【讨论】:

  • 先生,我是初学者,正在观看视频进行练习。任何帮助将不胜感激提前谢谢
  • @Mashhad:嗯...好吗?关于这里的问题和答案,您有任何后续行动吗?
  • 我正在关注视频,一切似乎都很好,但现在我的登录功能有问题,如果我使用提交而不是按钮,那么它将返回索引并看到一个匿名帖子人,那么我无法编辑或删除帖子
  • @Mashhad:那么您将不得不调试为什么会发生这种情况。逐步检查调试器中的服务器端代码,看看有什么没有按预期工作。正如我在此答案的最后陈述中提到的,您甚至没有查看服务器端代码中的密码,这非常奇怪。如果代码从不检查他们的密码,我会期望用户没有登录。也许您应该将密码与用户名一起发送到服务器,并将该密码的哈希值与存储的哈希值进行比较。 (您可能还应该找到更好的教程,这听起来糟糕。)
【解决方案3】:

如果是对getPasswordHash 的调用导致了错误,或者该函数中的某些问题,请检查以下几点:

1) javascript 文件 Login.jsSHA256.js 都在加载吗?

2) 如果是,如果您在浏览器中查看页面的源代码,&lt;input type="hidden" name="nonce" id="nonce" value="@Model"/&gt; 是否设置了值?您的控制器似乎没有为传递到视图中的模型设置值,并且由于 SHA256 引用了 nonce 值,这可能会导致问题。

3) 鉴于 Login.js 引用 SHA256.js,而不是相反,将 SHA256.js 调用置于 Login.js 之上

就像大卫说的那样,如果这是一个你正在学习的教程,那么好的,但否则最好在服务器而不是客户端进行密码哈希。

【讨论】:

    【解决方案4】:

    首先,使用来自 Alex Weber 的 MVC3 Jquery 1.5 和 SHA256 V1.0。

    其次,代码有缺陷。

    我也在关注“从零到博客”系列。此时我正在调试哈希生成代码,因为我登录没有问题。

    我的问题是登录后它没有给我“删除”和“编辑”选项。

    在调试代码时这是正确的,2 个哈希

    Session["IsAdmin"] = (computedHash.ToLower() == hash.ToLower()); 
    

    来自AccountController.cs在这一行比较的不一样,每次都有完全不同的值。

    【讨论】:

    • 嗨,约翰,欢迎来到 stackoverflow!您尚未发布对所提出问题的答案,这不是 stackoverflow 的工作方式。请参观:stackoverflow.com/tour,然后您可能需要考虑为您的特定问题创建一个新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    相关资源
    最近更新 更多