【问题标题】:2 Factor Authentication in Web Api project2 Web Api 项目中的因素身份验证
【发布时间】:2016-10-11 19:28:15
【问题描述】:

我正在尝试在 Web Api 项目中实现 2 因素身份验证。但是在 AccountController 继承 ApiController 的 Web Api 中似乎无法实现 2FA。是否可以在 Web Api 解决方案而不是 MVC 中实现 2FA?

【问题讨论】:

    标签: asp.net asp.net-web-api asp.net-web-api2


    【解决方案1】:

    这个问题非常广泛,但是回答你的问题是有可能的。

    请看这里 - http://bitoftech.net/2014/10/15/two-factor-authentication-asp-net-web-api-angularjs-google-authenticator/

    来自负责生成验证码的链接代码-

    public static class TimeSensitivePassCode
    {
        public static string GeneratePresharedKey()
        {
            byte[] key = new byte[10]; // 80 bits
            using (var rngProvider = new RNGCryptoServiceProvider())
            {
                rngProvider.GetBytes(key);
            }
    
            return key.ToBase32String();
        }
    
        public static IList<string> GetListOfOTPs(string base32EncodedSecret)
        {
            DateTime epochStart = new DateTime(1970, 01, 01, 0, 0, 0, 0, DateTimeKind.Utc);
    
            long counter = (long)Math.Floor((DateTime.UtcNow - epochStart).TotalSeconds / 30);
            var otps = new List<string>();
    
            otps.Add(GetHotp(base32EncodedSecret, counter - 1)); // previous OTP
            otps.Add(GetHotp(base32EncodedSecret, counter)); // current OTP
            otps.Add(GetHotp(base32EncodedSecret, counter + 1)); // next OTP
    
            return otps;
        }
    
        private static string GetHotp(string base32EncodedSecret, long counter)
        {
            byte[] message = BitConverter.GetBytes(counter).Reverse().ToArray(); //Intel machine (little endian) 
            byte[] secret = base32EncodedSecret.ToByteArray();
    
            HMACSHA1 hmac = new HMACSHA1(secret, true);
    
            byte[] hash = hmac.ComputeHash(message);
            int offset = hash[hash.Length - 1] & 0xf;
            int truncatedHash = ((hash[offset] & 0x7f) << 24) |
            ((hash[offset + 1] & 0xff) << 16) |
            ((hash[offset + 2] & 0xff) << 8) |
            (hash[offset + 3] & 0xff);
    
            int hotp = truncatedHash % 1000000; 
            return hotp.ToString().PadLeft(6, '0');
        }
    }
    
    public static class StringHelper
    {
        private static string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
    
        public static string ToBase32String(this byte[] secret)
        {
            var bits = secret.Select(b => Convert.ToString(b, 2).PadLeft(8, '0')).Aggregate((a, b) => a + b);
    
            return Enumerable.Range(0, bits.Length / 5).Select(i => alphabet.Substring(Convert.ToInt32(bits.Substring(i * 5, 5), 2), 1)).Aggregate((a, b) => a + b);
        }
    
        public static byte[] ToByteArray(this string secret)
        {
            var bits = secret.ToUpper().ToCharArray().Select(c => Convert.ToString(alphabet.IndexOf(c), 2).PadLeft(5, '0')).Aggregate((a, b) => a + b);
    
            return Enumerable.Range(0, bits.Length / 8).Select(i => Convert.ToByte(bits.Substring(i * 8, 8), 2)).ToArray();
        }
    
    }
    

    【讨论】:

    • 感谢您的回复。我想知道如何在 MVC 生成验证码和验证用户中,像 MVC 一样的东西可以在 Web API 中存档,而无需 3rd 方生成验证码。
    • 只是想在我之前的评论中添加更多内容。是否可以使用 Web API 发送 2FA 验证码。
    • 添加了负责生成验证码的代码
    猜你喜欢
    • 2012-12-02
    • 2014-01-28
    • 2016-07-16
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 2017-03-04
    • 2011-05-02
    • 2016-02-24
    相关资源
    最近更新 更多