【问题标题】:ASP.NET Identity's way of hashing password Compared to Crypto.HashPasswordASP.NET Identity 的密码散列方式与 Crypto.HashPassword 的比较
【发布时间】:2016-09-02 09:54:18
【问题描述】:

大家好。我目前正在 Xamarin.Forms 便携式应用程序中创建登录表单。我有一个 WebFormsProject,我在其中创建了一个 API 控制器,用于比较用户输入的用户名和密码与保存在我的数据库中的用户名和密码。

保存在我的数据库中的密码是使用 ASP.NET 身份进行哈希处理的。虽然用户输入的密码使用 Crypto.HashPassword 进行哈希处理(不知道这个类是否是 ASP.NET Identity 的东西)。

如何比较这两者?

如果两个密码匹配,它应该返回'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);




        }

    }
}

【问题讨论】:

    标签: c# asp.net xamarin xamarin.forms asp.net-identity


    【解决方案1】:

    密码哈希通常使用 PasswordHasher 类中的 VerifyHashedPassword 方法进行比较。检查此链接:Verifies that a password matches the hashed password.

    编辑:
    根据评论 事实证明,使用 Crypto.HashedPassword 将产生一个与我的数据库中保存的哈希值不同的哈希值。

    您需要提供IPasswordHasher 实现,该实现可以提供清晰的密码而无需散列。

    public class ClearPassword : IPasswordHasher
    {
        public string HashPassword(string password)
        {
            return password;
        }
    }
    

    将为您提供清晰的密码,您可以使用该密码与输入的密码进行比较。

    【讨论】:

    • 我该怎么办?这只是一个声明? ASP.NET Identity 中使用什么哈希算法?
    • @JayceeEvangelista,我该怎么办? 你可以使用它来解决你的问题,这只是一个声明? 是的。 ASP.NET Identity 中使用什么哈希算法 和这个一样:brockallen.com/2012/10/19/…)
    • 我将它应用到我的代码中。事实证明,使用 Crypto.HashedPassword 将产生一个与我的数据库中保存的哈希值不同的哈希值。仅仅是因为他们有不同的哈希算法。
    • 我真的需要为此 ClearPassword 创建一个单独的类吗?是否可以将其包含在我拥有的当前 LoginController.cs 中?如果是,我的代码应该是什么样子?
    • 根据我的建议,您必须添加一个单独的类。 是否可以仅将其包含在当前的 LoginController.cs 中您可以尝试在控制器中添加类,但这不是最佳实践。
    【解决方案2】:

    返回 Crypto.VerifyHashedPassword 的第二个参数并不是要经过哈希处理,而是要纯文本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-05
      • 2015-01-29
      • 2017-10-20
      • 2020-08-09
      • 2016-09-19
      • 1970-01-01
      • 2018-09-17
      • 1970-01-01
      相关资源
      最近更新 更多