Exemple #1
0
        public async Task <IHttpActionResult> ExternalLoginComplete(string access_token)
        {
            ExternalAccessToken externalToken = ExternalTokenHandler.Unprotect(access_token);

            if (externalToken == null || !externalToken.IsValid)
            {
                return(BadRequest("External login failure."));
            }

            string userId = await IdentityStore.GetUserIdForLogin(externalToken.LoginProvider,
                                                                  externalToken.ProviderKey);

            if (String.IsNullOrEmpty(userId))
            {
                return(Content(HttpStatusCode.OK, new RegisterExternalLoginViewModel
                {
                    UserName = externalToken.DisplayName,
                    LoginProvider = externalToken.LoginProvider
                }));
            }

            ClaimsIdentity identity = await GetIdentityAsync(userId);

            string token = CreateAccessToken(identity);
            IUser  user  = await IdentityStore.Context.Users.Find(userId);

            return(OAuthAccessToken(token, "bearer", user.UserName));
        }
Exemple #2
0
        public async Task <IHttpActionResult> AddExternalLogin(AddExternalLoginBindingModel model)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            ExternalAccessToken token = ExternalTokenHandler.Unprotect(model.ExternalAccessToken);

            if (token == null || !token.IsValid)
            {
                return(BadRequest("External login failure."));
            }

            string userId = await IdentityStore.GetUserIdForLogin(token.LoginProvider, token.ProviderKey);

            if (!String.IsNullOrEmpty(userId))
            {
                return(BadRequest("The external login is already associated with an account."));
            }

            // The current user is logged in, just add the new account
            if (!await IdentityStore.AddLogin(User.Identity.GetUserId(), token.LoginProvider, token.ProviderKey))
            {
                return(BadRequest("Failed to add the external login."));
            }

            return(OK());
        }
Exemple #3
0
        public async Task <IHttpActionResult> RegisterExternal(RegisterExternalBindingModel model)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            ExternalAccessToken externalToken = ExternalTokenHandler.Unprotect(model.ExternalAccessToken);

            if (externalToken == null || !externalToken.IsValid)
            {
                return(BadRequest("External login failure."));
            }

            string existingUserId = await IdentityStore.GetUserIdForLogin(externalToken.LoginProvider,
                                                                          externalToken.ProviderKey);

            if (!String.IsNullOrEmpty(existingUserId))
            {
                return(BadRequest("The external login is already associated with an account."));
            }

            if (await IdentityStore.GetUserIdForLocalLogin(model.UserName) != null)
            {
                return(BadRequest("A user with the name '{0}' already exists.", model.UserName));
            }

            // Create a profile and link the local account before signing in the user
            User user = new User(model.UserName);

            try
            {
                if (!await IdentityStore.CreateExternalUser(user, externalToken.LoginProvider,
                                                            externalToken.ProviderKey))
                {
                    return(BadRequest("Failed to create login for '{0}'.", model.UserName));
                }
            }
            catch (IdentityException e)
            {
                return(BadRequest(e.ToString()));
            }

            InitiateDatabaseForNewUser(user.Id);
            ClaimsIdentity identity = await GetIdentityAsync(user.Id);

            string token = CreateAccessToken(identity);

            return(OAuthAccessToken(token, "bearer", user.UserName));
        }