是否存在仅检查用户名密码组合的Membership.ValidateUser()替代方案?

时间:2011-12-29 01:47:54

标签: asp.net-mvc asp.net-membership

是否存在仅检查用户名密码组合的Membership.ValidateUser备选方案?换句话说,有没有办法告诉用户名和密码是正确的,但用户无效?在为注册实施确认电子邮件时,它可能会派上用场。

1 个答案:

答案 0 :(得分:0)

是,

只需在用户数据存储区中进行查找。

例如

public static string IsUserValid(string username, string password)
{
    if(!String.IsNullOrEmpty(username) && !String.IsNullOrEmpty(password))
    {

         var allIsGood = true;
         // query user datastore for username and password
         // change allIsGood to true or false based on result

         return allIsGood;
    }

    return false;
}

编辑:

我使用的加密密码和MD5哈希。所以这个助手类可能会有所帮助

#region Usings

using System.Security.Cryptography;
using System.Text;

#endregion

namespace Shared.Tools
{
public static class Crypto
{
    public static string CalculateMd5Hash(string input)
    {
        // step 1, calculate MD5 hash from input
        var md5 = System.Security.Cryptography.MD5.Create();
        var inputBytes = Encoding.ASCII.GetBytes(input);
        var hash = md5.ComputeHash(inputBytes);

        // step 2, convert byte array to hex string
        var sb = new StringBuilder();
        for (var i = 0; i < hash.Length; i++)
        {
            sb.Append(hash[i].ToString("x2"));
        }
        return sb.ToString();
    }

    public static string GetHashValue(this MD5 hash, string value)
    {
        return GetHashValue(hash, Encoding.UTF8.GetBytes(value));
    }

    public static string GetHashValue(this MD5 hash, byte[] value)
    {
        var data = hash.ComputeHash(value);
        var md5 = "";
        for (var i = 0; i < data.Length; i++)
        {
            md5 += data[i].ToString("x2").ToLowerInvariant();
        }

        return md5;
    }

    public static string MD5(this string value)
    {
        var algorithm =
            System.Security.Cryptography.MD5.Create();

        var data = Encoding.ASCII.GetBytes(value);
        data = algorithm.ComputeHash(data);
        var md5 = "";
        for (var i = 0; i < data.Length; i++)
        {
            md5 += data[i].ToString("x2").ToLower();
        }

        return md5;
    }
}
}

你可能会为你的测试方法做这样的事情

public static string IsUserValid(string username, string password)
{
    // using Linq to Entities/Sql
    return  YourDataContext
            .Users
            .Where(u => u.UserName == username
                     && u.Password == password.MD5)
            .FirstOrDefault() != null;
}

我没有对此进行编译或测试,但它应该为您提供您所追求的内容。