大家好。我目前在Xamarin创建一个登录表单。可移植的应用程序。我有一个WebFormsProject,其中我创建了一个API控制器,用于比较用户键入的用户名和密码与保存在我的数据库中的用户名和密码。
密码保存在我的数据库是哈希使用ASP。净的身份。而用户将输入的密码使用Crypto进行散列。HashPassword(不知道这个类是否是ASP。. NET Identity thing).
我如何比较这两者?
如果两个密码匹配,它应该返回'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);
}
}
}
密码哈希值通常使用PasswordHasher类中的verifyhashhedpassword方法进行比较。检查此链接:验证密码是否与散列密码匹配。
编辑:
根据评论,事实证明,使用加密。hashhedpassword生成的哈希值与保存在我的数据库中的哈希值不同
你需要提供IPasswordHasher
实现,可以提供清晰的密码而不需要哈希。
public class ClearPassword : IPasswordHasher
{
public string HashPassword(string password)
{
return password;
}
}
将给你一个清晰的密码,你可以用它来与输入的密码进行比较。
第二个返回Crypto的参数。verifyhashhedpassword不是用来散列的,它是纯文本。