ASP.NET标识 - 无框架验证密码

时间:2015-11-18 08:34:04

标签: c# asp.net-mvc hash asp.net-identity md5

背景

我正在使用

Microsoft.AspNet.Identity;

MVC网站中的框架。我在网站上实现了密码检索,电子邮件确认等所有标准功能。

我的问题

我想在Xamarin c#中创建一个非常基本的应用程序,但我希望它使用我在我的网站上设置的数据库,当然 - 包括验证密码。

根据我的想法,它应该是这样的:

  1. 用户在手机上输入登录详细信息。
  2. 电话哈希密码并使用WCF服务,该服务将哈希字符串作为输入
  3. 返回bool。取决于哈希验证。
  4. 我无法使用

    Microsoft.AspNet.Identity;
    

    在我的Xamarin App上。

    问题

    如何重新创建Asp.Identity使用的哈希,以便验证密码?

    如果情况是我必须使用原始密码使用WCF(这样安全吗?)并对服务本身进行散列 - 我是否可以使用Identity框架?如果没有,那么我仍然有创建/验证哈希的问题。

    另外,如果我对这些哈希函数有所了解,请随时教我:)

    额外信息

    我尝试过的散列函数给出了与Identity框架完全不同的散列 - 在我的测试中,我发现创建具有完全相同密码的用户会产生不同的散列。 (由于使用盐?)

1 个答案:

答案 0 :(得分:1)

好的,我找到了解决方案

为有类似问题的人发布

this引用zespri回答。 顺便提升

我决定使用原始密码和用户名来使用WCF,只需使用该功能验证上述答案提供的内容。

修改

只是为了澄清它是用来验证密码的这段代码(取自上面的链接):

public static bool VerifyHashedPassword(string hashedPassword, string password)
{
byte[] buffer4;
if (hashedPassword == null)
{
    return false;
}
if (password == null)
{
    throw new ArgumentNullException("password");
}
byte[] src = Convert.FromBase64String(hashedPassword);
if ((src.Length != 0x31) || (src[0] != 0))
{
    return false;
}
byte[] dst = new byte[0x10];
Buffer.BlockCopy(src, 1, dst, 0, 0x10);
byte[] buffer3 = new byte[0x20];
Buffer.BlockCopy(src, 0x11, buffer3, 0, 0x20);
using (Rfc2898DeriveBytes bytes = new Rfc2898DeriveBytes(password, dst, 0x3e8))
{
    buffer4 = bytes.GetBytes(0x20);
}
return ByteArraysEqual(buffer3, buffer4);
}