MVC 5 ASP.Net FORM submit()函数不起作用

时间:2016-01-19 19:06:01

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

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

@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();
    }
编辑:getPasswordHash当我右键点击它的定义时,它告诉我“失败”  或者是因为插入符已经在定义中,或者因为找不到明确的定义

4 个答案:

答案 0 :(得分:0)

使用HTTP post属性

装饰你的动作方法
 [HttpPost]
 public ActionResult Login(string name, string hash)
 {
 }

Http get and post more info

答案 1 :(得分:0)

最简单的方法是首先不要使用JavaScript。它没有完成任何事情,因为你有服务器端代码来计算哈希值。它甚至可能存在安全风险,因为它会向任何想要查看它的人公开哈希计算(包括您使用的任何盐)。

完全删除它并使用普通的提交按钮:

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

当然,还要删除这一行:

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

从操作方法中删除hash参数:

public ActionResult Login(string name)

你可以删除更多内容。例如,“nonce”元素以及首先传递给视图的相应模型。 (看起来真的有许多活动部分涉及功能,首先不应该存在。)

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

答案 2 :(得分:0)

如果是getPasswordHash对{1}}的调用导致错误或该功能中的某些内容,请执行以下操作:

1)javascript文件Login.jsSHA256.js是否一定要加载?

2)如果是,如果您在浏览器中查看该页面的来源,<input type="hidden" name="nonce" id="nonce" value="@Model"/>是否设置了值?你的控制器似乎没有设置一个传递给视图的模型的值,并且给定SHA256引用nonce值,这可能会导致问题。

3)鉴于Login.js引用SHA256.js,而不是相反,将调用放在Login.js上面的SHA256.js

就像大卫所说的那样,如果这是一个你从那时学习的教程,那么好吧,但是最好在服务器而不是客户端做密码哈希。

答案 3 :(得分:0)

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

其次,代码有缺陷。

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

我的问题是它没有给我&#34;删除&#34;和&#34;编辑&#34;登录后的选项。

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

Session["IsAdmin"] = (computedHash.ToLower() == hash.ToLower()); 
来自AccountController.cs

在此行中进行比较并不相同,并且每次都有完全不同的值。