public async Task <IHttpActionResult> AddExternalLogin(AddExternalLoginBindingModel model)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            Authentication.SignOut(DefaultAuthenticationTypes.ExternalCookie);

            AuthenticationTicket ticket = AccessTokenFormat.Unprotect(model.ExternalAccessToken);

            if (ticket == null || ticket.Identity == null || (ticket.Properties != null &&
                                                              ticket.Properties.ExpiresUtc.HasValue &&
                                                              ticket.Properties.ExpiresUtc.Value < DateTimeOffset.UtcNow))
            {
                return(BadRequest("External login failure."));
            }

            ExternalLoginData externalData = ExternalLoginData.FromIdentity(ticket.Identity);

            if (externalData == null)
            {
                return(BadRequest("The external login is already associated with an account."));
            }

            IdentityResult result = await UserManager.AddLoginAsync(User.Identity.GetUserId(),
                                                                    new UserLoginInfo(externalData.LoginProvider, externalData.ProviderKey));

            if (!result.Succeeded)
            {
                return(GetErrorResult(result));
            }

            return(Ok());
        }
        public async Task <IHttpActionResult> AddExternalLogin(AddExternalLoginBindingModel model)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            Authentication.SignOut(DefaultAuthenticationTypes.ExternalCookie);

            AuthenticationTicket ticket = AccessTokenFormat.Unprotect(model.ExternalAccessToken);

            if (ticket == null || ticket.Identity == null || (ticket.Properties != null &&
                                                              ticket.Properties.ExpiresUtc.HasValue &&
                                                              ticket.Properties.ExpiresUtc.Value < DateTimeOffset.UtcNow))
            {
                return(BadRequest("Fehler bei der externen Anmeldung."));
            }

            ExternalLoginData externalData = ExternalLoginData.FromIdentity(ticket.Identity);

            if (externalData == null)
            {
                return(BadRequest("Die externe Anmeldung ist bereits einem Konto zugeordnet."));
            }

            IdentityResult result = await UserManager.AddLoginAsync(User.Identity.GetUserId(),
                                                                    new UserLoginInfo(externalData.LoginProvider, externalData.ProviderKey));

            if (!result.Succeeded)
            {
                return(GetErrorResult(result));
            }

            return(Ok());
        }
Example #3
0
        public async Task <ResponseMessage> AddExternalLogin(AddExternalLoginBindingModel model)
        {
            //string ip = StaticTools.GetIp(Request);
            try
            {
                if (!ModelState.IsValid)
                {
                    return(new ResponseMessage(Tools.ResponseMessage.ResponseCode.AuthenticationFailed, ErrorMessages.RegisterError, ModelState));;
                }

                Authentication.SignOut(DefaultAuthenticationTypes.ExternalCookie);

                AuthenticationTicket ticket = AccessTokenFormat.Unprotect(model.ExternalAccessToken);

                if (ticket == null || ticket.Identity == null || (ticket.Properties != null &&
                                                                  ticket.Properties.ExpiresUtc.HasValue &&
                                                                  ticket.Properties.ExpiresUtc.Value < DateTimeOffset.UtcNow))
                {
                    return(new ResponseMessage(Tools.ResponseMessage.ResponseCode.AuthenticationFailed, "ورود خارجی ناموفق"));;
                }

                ExternalLoginData externalData = ExternalLoginData.FromIdentity(ticket.Identity);

                if (externalData == null)
                {
                    return(new ResponseMessage(Tools.ResponseMessage.ResponseCode.AuthenticationFailed, "The external login is already associated with an account."));
                }

                IdentityResult result = await UserManager.AddLoginAsync(User.Identity.GetUserId(),
                                                                        new UserLoginInfo(externalData.LoginProvider, externalData.ProviderKey));

                if (!result.Succeeded)
                {
                    return(new ResponseMessage(Tools.ResponseMessage.ResponseCode.AuthenticationFailed, ErrorMessages.RegisterError, result));
                }

                return(Tools.ResponseMessage.Ok);
            }
            catch
            {
                return(Tools.ResponseMessage.InternalError);
            }
        }
Example #4
0
        public async Task <IHttpActionResult> AddExternalLogin(AddExternalLoginBindingModel model)
        {
            if (!this.ModelState.IsValid)
            {
                return(this.BadRequest(this.ModelState));
            }

            this.Authentication.SignOut(DefaultAuthenticationTypes.ExternalCookie);

            var ticket = this.AccessTokenFormat.Unprotect(model.ExternalAccessToken);

            if (ticket == null || ticket.Identity == null ||
                (ticket.Properties != null && ticket.Properties.ExpiresUtc.HasValue &&
                 ticket.Properties.ExpiresUtc.Value < DateTimeOffset.UtcNow))
            {
                return(this.BadRequest("Failed to login to the external provider."));
            }

            var externalData = ExternalLoginData.FromIdentity(ticket.Identity);

            if (externalData == null)
            {
                return(this.BadRequest("This external login is already associated with an account."));
            }

            var result =
                await
                this.UserManager.AddLoginAsync(
                    this.User.Identity.GetUserId(),
                    new UserLoginInfo(externalData.LoginProvider, externalData.ProviderKey));

            var errorResult = this.GetErrorResult(result);

            if (errorResult != null)
            {
                return(errorResult);
            }

            return(this.Ok());
        }
Example #5
0
        public async Task <IHttpActionResult> AddExternalLogin(AddExternalLoginBindingModel model)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            Authentication.SignOut(DefaultAuthenticationTypes.ExternalCookie);

            AuthenticationTicket ticket = AccessTokenFormat.Unprotect(model.ExternalAccessToken);

            if (ticket == null || ticket.Identity == null || (ticket.Properties != null &&
                                                              ticket.Properties.ExpiresUtc.HasValue &&
                                                              ticket.Properties.ExpiresUtc.Value < DateTimeOffset.UtcNow))
            {
                return(BadRequest("Error de inicio de sesión externo."));
            }

            ExternalLoginData externalData = ExternalLoginData.FromIdentity(ticket.Identity);

            if (externalData == null)
            {
                return(BadRequest("El inicio de sesión externo ya está asociado con una cuenta."));
            }

            IdentityResult result = await UserManager.AddLoginAsync(User.Identity.GetUserId(),
                                                                    new UserLoginInfo(externalData.LoginProvider, externalData.ProviderKey));

            IHttpActionResult errorResult = GetErrorResult(result);

            if (errorResult != null)
            {
                return(errorResult);
            }

            return(Ok());
        }
        public async Task <IHttpActionResult> AddExternalLogin(AddExternalLoginBindingModel model)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            Authentication.SignOut(DefaultAuthenticationTypes.ExternalBearer);

            AuthenticationTicket ticket = AccessTokenFormat.Unprotect(model.ExternalAccessToken);

            if (ticket == null || ticket.Identity == null || (ticket.Properties != null &&
                                                              ticket.Properties.ExpiresUtc.HasValue &&
                                                              ticket.Properties.ExpiresUtc.Value < DateTimeOffset.UtcNow))
            {
                return(BadRequest("Сбой внешнего входа."));
            }

            ExternalLoginData externalData = ExternalLoginData.FromIdentity(ticket.Identity);

            if (externalData == null)
            {
                return(BadRequest("Внешнее имя входа уже связано с учетной записью."));
            }

            IdentityResult result = await UserManager.AddLoginAsync(User.Identity.GetUserId(),
                                                                    new UserLoginInfo(externalData.LoginProvider, externalData.ProviderKey));

            IHttpActionResult errorResult = GetErrorResult(result);

            if (errorResult != null)
            {
                return(errorResult);
            }

            return(Ok());
        }
        public async Task<IHttpActionResult> AddExternalLogin(AddExternalLoginBindingModel model)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            Authentication.SignOut(DefaultAuthenticationTypes.ExternalCookie);

            AuthenticationTicket ticket = AccessTokenFormat.Unprotect(model.ExternalAccessToken);

            if (ticket == null || ticket.Identity == null || (ticket.Properties != null
                && ticket.Properties.ExpiresUtc.HasValue
                && ticket.Properties.ExpiresUtc.Value < DateTimeOffset.UtcNow))
            {
                return BadRequest("External login failure.");
            }

            ExternalLoginData externalData = ExternalLoginData.FromIdentity(ticket.Identity);

            if (externalData == null)
            {
                return BadRequest("The external login is already associated with an account.");
            }

            IdentityResult result = await UserManager.AddLoginAsync(User.Identity.GetUserId(),
                new UserLoginInfo(externalData.LoginProvider, externalData.ProviderKey));

            if (!result.Succeeded)
            {
                return GetErrorResult(result);
            }

            return Ok();
        }
        public async Task<IHttpActionResult> AddExternalLogin(AddExternalLoginBindingModel model)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            Authentication.SignOut(DefaultAuthenticationTypes.ExternalCookie);

            AuthenticationTicket ticket = AccessTokenFormat.Unprotect(model.ExternalAccessToken);

            if (ticket == null || ticket.Identity == null || (ticket.Properties != null
                && ticket.Properties.ExpiresUtc.HasValue
                && ticket.Properties.ExpiresUtc.Value < DateTimeOffset.UtcNow))
            {
                return BadRequest("Сбой внешнего входа.");
            }

            ExternalLoginData externalData = ExternalLoginData.FromIdentity(ticket.Identity);

            if (externalData == null)
            {
                return BadRequest("Внешнее имя входа уже связано с учетной записью.");
            }

            IdentityResult result = await UserManager.AddLoginAsync(User.Identity.GetUserId(),
                new UserLoginInfo(externalData.LoginProvider, externalData.ProviderKey));

            if (!result.Succeeded)
            {
                return GetErrorResult(result);
            }

            return Ok();
        }
Example #9
0
        //http://blog.valeriogheri.com/asp-net-webapi-identity-system-how-to-login-with-facebook-access-token
        public async Task <IHttpActionResult> GoogleLogin(AddExternalLoginBindingModel model)
        {
            if (string.IsNullOrEmpty(model.ExternalAccessToken))
            {
                return(BadRequest("Invalid OAuth access token"));
            }
            ApplicationUser user = null;

            // Get the fb access token and make a graph call to the /me endpoint
            VerifyToken verifyToken = new VerifyToken();
            var         fbUser      = await verifyToken.VerifyGoogleAccessToken(null, model.ExternalAccessToken);

            if (fbUser == null)
            {
                return(BadRequest("Invalid OAuth access token"));
            }
            if (!fbUser.aud.Equals(VerifyToken.CLIENT_ID))
            {
                return(BadRequest("Invalid OAuth access token"));
            }

            try
            {
                using (var dbTransaction = db.Database.BeginTransaction())
                {
                    if (model.Email != null)
                    {
                        // model.Email is an application account's email, not google login's email
                        user = await UserManager.FindByEmailAsync(model.Email);

                        if (user == null)
                        {
                            return(BadRequest("Invalid Email"));
                        }
                        //
                        bool isGoogleLoginAlreadyBelongToTheUser = false;
                        var  userLogins = await UserManager.GetLoginsAsync(user.Id);

                        foreach (UserLoginInfo userLoginInfo in userLogins)
                        {
                            if (userLoginInfo.LoginProvider.Equals("Google") && userLoginInfo.ProviderKey.Equals(fbUser.sub))
                            {
                                isGoogleLoginAlreadyBelongToTheUser = true;
                                break;
                            }
                        }
                        if (!isGoogleLoginAlreadyBelongToTheUser)
                        {
                            bool isGoogleLoginAlreadyBelongToSomeOtherUser = db.Users.Where(u => u.Logins.Any(l => l.LoginProvider.Equals("Google") && l.ProviderKey.Equals(fbUser.sub))).Count() > 0;
                            if (isGoogleLoginAlreadyBelongToSomeOtherUser)
                            {
                                return(BadRequest("Invalid OAuth access token"));
                            }
                            else
                            {
                                if (!user.EmailConfirmed && !user.Email.ToLower().Equals(fbUser.Email.ToLower()))
                                {
                                    return(BadRequest("Application account's email is not confirmed yet"));
                                }
                                //add login
                                //user.Logins.Add(new IdentityUserLogin() { LoginProvider = "Google", ProviderKey = fbUser.sub });

                                IdentityResult result = await UserManager.AddLoginAsync(user.Id, new UserLoginInfo("Google", fbUser.sub));

                                if (!result.Succeeded)
                                {
                                    return(GetErrorResult(result));
                                }
                                //make email confirmed
                                user.EmailConfirmed = true;
                            }
                        }
                        else
                        {
                            //nothing to do
                        }
                    }
                    else
                    {
                        //try to find user
                        user = db.Users.Where(u => u.Logins.Any(l => l.LoginProvider.Equals("Google") && l.ProviderKey.Equals(fbUser.sub))).SingleOrDefault();
                        if (user == null)
                        {
                            // user not found so
                            //create user and add login
                            string randomPassword;

                            //At least one lower case letter
                            Regex r1 = new Regex("[a-z]+");
                            //At least one upper case letter
                            Regex r2 = new Regex("[A-Z]+");
                            //At least one digit
                            Regex r3 = new Regex("[0-9]+");

                            string NewPassword = System.Web.Security.Membership.GeneratePassword(10, 5);

                            while (!(r1.IsMatch(NewPassword) && r2.IsMatch(NewPassword) && r3.IsMatch(NewPassword)))
                            {
                                //regenerate new password
                                NewPassword = System.Web.Security.Membership.GeneratePassword(10, 5);
                            }
                            randomPassword = NewPassword;
                            user           = new ApplicationUser()
                            {
                                UserName = fbUser.Email, Email = fbUser.Email, EmailConfirmed = true
                            };
                            IdentityResult result = await UserManager.CreateAsync(user, randomPassword);

                            if (!result.Succeeded)
                            {
                                return(GetErrorResult(result));
                                //return Conflict();
                            }

                            //user.Logins.Add(new IdentityUserLogin() { LoginProvider = "Google", ProviderKey = fbUser.sub });

                            IdentityResult result2 = await UserManager.AddLoginAsync(user.Id, new UserLoginInfo("Google", fbUser.sub));

                            if (!result2.Succeeded)
                            {
                                return(GetErrorResult(result2));
                            }
                        }
                        else
                        {
                            //nothing to do
                        }
                    }
                    db.SaveChanges();
                    dbTransaction.Commit();
                }
            }
            catch (Exception e)
            {
                return(Conflict());
            }
            // Finally sign-in the user: this is the key part of the code that creates the bearer token and authenticate the user
            var identity = new ClaimsIdentity(Startup.OAuthOptions.AuthenticationType);

            identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, user.Id, null, ClaimsIdentity.DefaultIssuer));
            identity.AddClaim(new Claim(ClaimTypes.Name, user.UserName, null, ClaimsIdentity.DefaultIssuer));
            identity.AddClaim(new Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "ASP.NET Identity", null, ClaimsIdentity.DefaultIssuer));
            identity.AddClaim(new Claim("AspNet.Identity.SecurityStamp", user.SecurityStamp, null, ClaimsIdentity.DefaultIssuer));
            AuthenticationTicket ticket = new AuthenticationTicket(identity, new AuthenticationProperties());
            var currentUtc = new Microsoft.Owin.Infrastructure.SystemClock().UtcNow;

            ticket.Properties.IssuedUtc = currentUtc;
            var tokenExpirationTimeSpan = TimeSpan.FromDays(14);

            ticket.Properties.ExpiresUtc = currentUtc.Add(tokenExpirationTimeSpan);
            var accesstoken = Startup.OAuthOptions.AccessTokenFormat.Protect(ticket);

            Authentication.SignIn(identity);

            // Create the response
            JObject blob = new JObject(
                new JProperty("userName", user.UserName),
                new JProperty("access_token", accesstoken),
                new JProperty("token_type", "bearer"),
                new JProperty("expires_in", (long)tokenExpirationTimeSpan.TotalSeconds),
                new JProperty(".issued", ticket.Properties.IssuedUtc.ToString()),
                new JProperty(".expires", ticket.Properties.ExpiresUtc.ToString())
                );
            var json = Newtonsoft.Json.JsonConvert.SerializeObject(blob);

            // Return OK
            return(Ok(blob));
        }
Example #10
0
 public override Task <IHttpActionResult> AddExternalLogin(AddExternalLoginBindingModel model)
 {
     return(base.AddExternalLogin(model));
 }
 public void Init()
 {
     instance = new AddExternalLoginBindingModel();
 }