ASP.NET 코어 및 2FA 이중 인증은 실제적인 경험을 공유하기

개인 정보 보호 정책

코어 로직 소스는 여기에 사용 AspNetCore.Totp을 사용하지 왜, AspNetCore.Totp하지만 패키지의 사용은 나중에 소스를 설명한다.

원래의 URL을 제공하지 않습니다 재 인쇄를 방지하기 위해, 여기에 특별한 텍스트 링크를 추가
https://www.cnblogs.com/yuefengkai/p/11408339.html

이중 인증

이 두 요인을 알고 플러스는 인증 시스템의 역할을 함께 그룹화 한 수를 통해 이중 인증입니다. 이중 인증의 사용은 전통적인 정적 암호를 대체하기 위해 생성 시간 기반 일회용 암호, 키 이벤트 및 3 변수를 사용하여 시간 동기화 기술 시스템입니다. 각 동적 암호 카드가 동시에 서버에 저장되어있는 고유 키를 동적 암호 카드마다 동일한 키에 따른 서버 각각 동일한 임의의 파라미터 (시간, 이벤트)와 동일한 인증을 갖는다 알고리즘은 사용자 인증을 가능하게 암호 일관성을 보장하는 동적 패스워드 인증을 계산한다. 우리가 은행에 가서 암호 카드를 보낼 카드를 할 수 있습니다.

I. 서론

다른 로그인에 아폴로 스위치에 의한 계정 암호와 전화 인증 코드를 참조하십시오 18 세 기억 : 최근 내부 SSO 로그인이 안전한 방법을 찾고있다, 현재 프로그램이 구현 된 AspNetCore.Totp을 하며 데모 준비 dotNetCore은 -2FA에 다시이 기록 및 분석과 사운드를 쓰기 전에 로그인, 우리는 도움을 원한다.

두. AspNetCore.Totp

사용 이유를 설명 AspNetCore.Totp수정 및 재 포장 한 Brook.Totp결과를 AspNetCore.Totp404 (google.com) 웹 사이트에 액세스하기 위해 2 차원 코드 링크의 생성에, 국가가 간단하게 사용할 수 없습니다, 이 무슬림되지 않습니다 까지 사용하여 주입 인터페이스와 구현 클래스를 주입 할 필요가있다, 아주 지루한, 그래서 사용의 시작에 대한 더 쉽게, 및 2 차원 코드를 생성하기 위해 구글에 의존하지 않는

  1. 이차원 코드를 생성
accountIdentity = accountIdentity.Replace(" ", "");
            var encodedSecretKey = Base32.Encode(accountSecretKey);
            var provisionUrl = UrlEncoder.Encode(string.Format("otpauth://totp/{0}?secret={1}&issuer={2}", accountIdentity, encodedSecretKey, UrlEncoder.Encode(issuer)));
            var protocol = useHttps ? "https" : "http";
            var url = $"{protocol}://chart.googleapis.com/chart?cht=qr&chs={qrCodeWidth}x{qrCodeHeight}&chl={provisionUrl}";
            var totpSetup = new TotpSetup
            {
                QrCodeImage = this.GetQrImage(url),
                ManualSetupKey = encodedSecretKey
            };
  1. 주입법
    시동 분사
services.AddSingleton<ITotpSetupGenerator, TotpSetupGenerator>();
services.AddSingleton<ITotpValidator, TotpValidator>();
services.AddSingleton<ITotpGenerator, TotpGenerator>();

컨트롤러 주입

 private readonly ITotpGenerator _totpGenerator;
        private readonly ITotpSetupGenerator _totpSetupGenerator;
        private readonly ITotpValidator _totpValidator;


        public ValuesController(ITotpSetupGenerator totpSetupGenerator)
        {
            _totpSetupGenerator = totpSetupGenerator;
            _totpGenerator = new TotpGenerator();
            _totpValidator = new TotpValidator(_totpGenerator);
        }

세 가지. Brook.Totp

  1. 사용되는 이차원 코드 QRCoder이차원 코드를 생성 할 수는 외부 네트워크에 의존하지 않는
        /// <summary>
        /// 生成二维码
        /// </summary>
        /// <param name="provisionUrl"></param>
        /// <param name="pixelsPerModule"></param>
        /// <returns></returns>
        private string GetQrBase64Imageg(string provisionUrl,int pixelsPerModule)
        {
            QRCodeGenerator qrGenerator = new QRCodeGenerator();
            QRCodeData qrCodeData = qrGenerator.CreateQrCode(provisionUrl, QRCodeGenerator.ECCLevel.Q);
            Base64QRCode qrCode = new Base64QRCode(qrCodeData);
            string qrCodeImageAsBase64 = qrCode.GetGraphic(2);

            return  $"data:image/png;base64,{qrCodeImageAsBase64}";
        }
  1. 주입법
    시동 분사
services.AddBrookTotp();

컨트롤러 주입

private readonly ITotp _totp;
public AccountController(ITotp totp)
{
        _totp = totp;
}

IV. 이중 APP

추천 용도 마이크로 소프트 인증 자 지원 IOS는 안드로이드가 자동으로 백업 할 수 있습니다
구글 인증 자 전화를 사용하기 전에 Gitlab 및 보관 용은 더 이상 들어갈 수없는 고장 (고민 자신의 삼초 해당)

V. 전체 프로세스 렌더링

마이크로 소프트 인증 자 사용

  1. 일반 로그인
  2. 성공적으로 로그인 바인드 후
  3. 바인딩 후 다시 로그인

VI. 사용 방법

모든 소스 코드, 내 GitHub를 참조하십시오 https://github.com/yuefengkai/Brook.Totp
사용 데모

  1. EF Core In Memory Database모든 데이터는 메모리에 존재
  2. Cache in-memory
  3. dotNET Core Authentication

단지 코드의 일부를 보여줍니다 아래

  1. 새로운 항목 Nuget 패키지 netCoreMVC 추가Brook.Totp
  2. 시작 주입
services.AddMemoryCache();
services.AddSingleton<ICacheManage, CacheManage>();
services.AddBrookTotp();
services.AddDbContext<BrookTotpDBContext>(options => options.UseInMemoryDatabase(databaseName: "BrookTotpDB"));
  1. 컨트롤러 사용
private readonly ITotp _totp;
public AccountController(ITotp totp)
{
        _totp = totp;
}
//获取二维码
[Authorize]
public IActionResult GetQr()
{
    var totpSetup = _totp.GenerateUrl("dotNETBuild", CurremtUser.Email, CurremtUser.SecretKeyFor2FA);

    return Json(new { qrCodeContennt = totpSetup.QrCodeImageContent });
}
//验证双因素校验码
[Authorize]
[HttpPost]
public async Task<IActionResult> Valid(int code)
{
    var valid = _totp.Validate(CurremtUser.SecretKeyFor2FA
        , code, 30);

    if (!valid)
    {
        return Json(new { result = 0, msg = "2FA校验失败" });
    }
    //校验成功后 如果是第一次绑定校验 需将用户的accountSecretKey 存入数据库
    CurremtUser.IsOpen2FA = true;

    await _userService.UpdateAsync(CurremtUser);

    _cacheManage.Remove(string.Format(CacheKeys.GetUserForEmail, CurremtUser.Email));

    var claims = new List<Claim>
    {
        new Claim("user", CurremtUser.Email),
        new Claim("role", "Member")
    };

    await HttpContext.SignInAsync(new ClaimsPrincipal(new ClaimsIdentity(claims, "Cookies", "user", "role")));
    return Json(new { result = 1, msg = "2FA校验成功", url = "/Home/Index" });
}

VII. 마지막에 서면

위의 모든 소스 코드가 공개되어 공급하고있다 https://github.com/yuefengkai/Brook.Totp을
당신이 유용한 경우에, 저에게 시작을 적어주세요!

저자 : 브룩 (높은 Zengzhi)

추천

출처www.cnblogs.com/yuefengkai/p/11408339.html