2016-10-11 4 views
0

웹 API 프로젝트에서 2 팩터 인증을 구현하려고합니다. 그러나 2FA는 AccountController가 ApiController를 상속하는 Web API에서는 구현 될 수없는 것으로 보입니다. MVC가 아닌 Web API 솔루션에 2FA를 구현할 수 있습니까?웹 API 프로젝트에서 2 요소 인증

답변

0

질문은 매우 광범위하지만 질문에 대답하는 것은 가능합니다.

는 여기를 참조하십시오 - 검증 생성을 담당 링크에서 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(); 
    } 

} 
+0

감사 코드 -. 나는 MVC에서 검증 코드를 생성하고 사용자를 인증하는 방법을 MVC와 같은 제 3자가 검증 코드를 생성하지 않고 웹 API에 보관할 수 있는지 궁금하다. – Roman

+0

그냥 내 이전 댓글에 더 추가 생각. 웹 API를 사용하여 2FA 인증 코드를 보낼 수 있습니까? – Roman

+0

인증 코드를 생성하는 코드를 추가했습니다. –