今天是个好日子 . 我目前正在Xamarin.Forms Portable应用程序中创建一个登录表单 . 我有一个WebFormsProject,其中我创建了一个API控制器,用于比较用户键入的用户名和密码与我的数据库中保存的用户名和密码 .
保存在我的数据库中的密码是使用ASP.NET标识进行哈希处理的 . 虽然使用 Crypto.HashPassword 对用户输入的密码进行哈希处理(不知道此类是否为ASP.NET标识) .
我怎么能比较这两个呢?
如果两个密码匹配,则应返回“true”,否则返回false . 我现在处于一个令人困惑的阶段 . 希望您能够帮助我 . 谢谢 .
这是我的一些代码 .
LoginController.cs
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.Description;
using WebFormsDemo;
using WebFormsDemo.ViewModel;
using System.Security.Cryptography;
using System.Web.Helpers;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
using Microsoft.Owin.Security;
using Microsoft.AspNet.Identity.EntityFramework;
namespace WebFormsDemo.Controllers
{
public class LoginController : ApiController
{
private EBMSEntities db = new EBMSEntities();
// GET: api/Login
[Route("api/Login/Search/{username}/{password}")]
[ResponseType(typeof(List<AspNetUser>))]
public bool getUsernamePassword(string username, string password)
{
var hashedPassword = "";
hashedPassword = Crypto.HashPassword(password);
var pass = (from u in db.AspNetUsers
where u.UserName.Equals(username)
select u.PasswordHash).Take(1);
string hashpassinDb = Convert.ToString(pass.FirstOrDefault());
return Crypto.VerifyHashedPassword(hashpassinDb, hashedPassword);
}
}
}
2 回答
密码哈希通常使用PasswordHasher类中的VerifyHashedPassword方法进行比较 . 检查此链接:Verifies that a password matches the hashed password.
Edit:
根据评论事实证明,使用Crypto.HashedPassword将产生与我的数据库中保存的哈希值不同的哈希值 .
您需要提供
IPasswordHasher
实现,可以提供清除密码而无需散列 .将为您提供明确的密码,您可以使用该密码与输入的密码进行比较 .
返回Crypto.VerifyHashedPassword的第二个参数并不意味着要进行哈希处理,它应该是纯文本 .