Example #1
0
        public ActionResult Login(string keyHandle)
        {
            var model = new LoginDeviceViewModel { KeyHandle = keyHandle };

            try
            {
                var u2f = new FidoUniversalTwoFactor();
                var appId = new FidoAppId(Request.Url);

                var deviceRegistration = GetFidoRepository().GetDeviceRegistrationsOfUser(GetCurrentUser()).FirstOrDefault(x => x.KeyHandle.ToWebSafeBase64() == keyHandle);
                if (deviceRegistration == null)
                {
                    ModelState.AddModelError("", "Unknown key handle: " + keyHandle);
                    return View(model);
                }

                var startedRegistration = u2f.StartAuthentication(appId, deviceRegistration);

                model = new LoginDeviceViewModel
                {
                    AppId = startedRegistration.AppId.ToString(),
                    Challenge = startedRegistration.Challenge,
                    KeyHandle = startedRegistration.KeyHandle.ToWebSafeBase64(),
                    UserName = GetCurrentUser()
                };
            }
            catch (Exception ex)
            {
                ModelState.AddModelError("", ex.GetType().Name + ": " + ex.Message);
            }

            return View(model);
        }
Example #2
0
        public ActionResult Login(LoginDeviceViewModel model)
        {
            model = model ?? new LoginDeviceViewModel();

            try
            {
                if (!String.IsNullOrEmpty(model.RawAuthenticationResponse))
                {
                    var u2f = new FidoUniversalTwoFactor();
                    var appId = new FidoAppId(Request.Url);

                    var deviceRegistration = GetFidoRepository().GetDeviceRegistrationsOfUser(GetCurrentUser()).FirstOrDefault(x => x.KeyHandle.ToWebSafeBase64() == model.KeyHandle);
                    if (deviceRegistration == null)
                    {
                        ModelState.AddModelError("", "Unknown key handle: " + model.KeyHandle);
                        return View(new LoginDeviceViewModel());
                    }

                    var challenge = model.Challenge;

                    var startedAuthentication = new FidoStartedAuthentication(appId, challenge,
                        FidoKeyHandle.FromWebSafeBase64(model.KeyHandle ?? ""));

                    var counter = u2f.FinishAuthentication(startedAuthentication, model.RawAuthenticationResponse, deviceRegistration, GetTrustedDomains());

                    // save the counter somewhere, the device registration of the next authentication should use this updated counter
                    deviceRegistration.Counter = counter;

                    return RedirectToAction("LoginSuccess");
                }
            }
            catch (Exception ex)
            {
                ModelState.AddModelError("", ex.GetType().Name + ": " + ex.Message);
            }

            return View(model);
        }