我正在尝试使用以下方法获取登录表单。我正在使用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当我右键点击它的定义时,它告诉我“失败”
或者是因为插入符已经在定义中,或者因为找不到明确的定义
答案 0 :(得分:0)
使用HTTP post属性
装饰你的动作方法 [HttpPost]
public ActionResult Login(string name, string hash)
{
}
答案 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.js
和SHA256.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
的在此行中进行比较并不相同,并且每次都有完全不同的值。