public async Task <IHttpActionResult> ObtainLocalAccessToken(string provider, string externalAccessToken) { if (string.IsNullOrWhiteSpace(provider) || string.IsNullOrWhiteSpace(externalAccessToken)) { return(BadRequest("Provider or external access token is not sent")); } var verifiedAccessToken = await VerifyExternalAccessToken(provider, externalAccessToken); if (verifiedAccessToken == null) { return(BadRequest("Invalid Provider or External Access Token")); } var user = await JWTUserLoginManager.FindUserByLoginAsync(new IdentityUserLogin() { LoginProvider = provider, ProviderKey = verifiedAccessToken.user_id } ); var hasRegistered = user != null; if (!hasRegistered) { return(BadRequest("External user is not registered")); } //generate access token response var accessTokenResponse = GenerateLocalAccessTokenResponse(user); return(Ok(accessTokenResponse)); }
public async Task <IHttpActionResult> GetExternalLogin(string provider, string error = null) { var redirectUri = string.Empty; if (error != null) { return(BadRequest(Uri.EscapeDataString(error))); } if (User == null || !User.Identity.IsAuthenticated) { return(new ChallengeResult(provider, this)); } var redirectUriValidationResult = ValidateClientAndRedirectUri(ref redirectUri); if (!string.IsNullOrWhiteSpace(redirectUriValidationResult)) { return(BadRequest(redirectUriValidationResult)); } var externalLogin = ExternalLoginData.FromIdentity(User.Identity as ClaimsIdentity); if (externalLogin == null) { return(InternalServerError()); } if (externalLogin.LoginProvider != provider) { Authentication.SignOut(DefaultAuthenticationTypes.ExternalCookie); return(new ChallengeResult(provider, this)); } var user = await JWTUserLoginManager.FindUserByLoginAsync(new IdentityUserLogin() { LoginProvider = externalLogin.LoginProvider, ProviderKey = externalLogin.ProviderKey } ); var hasRegistered = user != null; redirectUri = string.Format( "{0}#external_access_token={1}&provider={2}&haslocalaccount={3}&external_user_name={4}&email={5}" , redirectUri , externalLogin.ExternalAccessToken , externalLogin.LoginProvider , hasRegistered.ToString() , externalLogin.UserName.Trim().Replace(" ", "") , externalLogin.Email ); return(Redirect(redirectUri)); }
public async Task <IHttpActionResult> RegisterExternal(RegisterExternalBindingModel model) { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } var verifiedAccessToken = await VerifyExternalAccessToken(model.Provider, model.ExternalAccessToken); if (verifiedAccessToken == null) { return(BadRequest("Invalid Provider or External Access Token")); } var user = await JWTUserLoginManager.FindUserByLoginAsync(new IdentityUserLogin() { LoginProvider = model.Provider, ProviderKey = verifiedAccessToken.user_id } ); var hasRegistered = user != null; if (hasRegistered) { return(BadRequest("External user is already registered")); } user = new IdentityUser(model.ClientId, model.UserName) { Email = model.EMail }; var result = await JWTUserManager.CreateAsync(user); if (!result.Succeeded) { return(GetErrorResult(result)); } var userRole = await JWTRoleManager.FindByNameAsync(IdentityConstants.User); if (userRole != null) { await JWTUserManager.AddToRoleAsync(user, userRole); } result = await JWTUserLoginManager.CreateAsync(new IdentityUserLogin() { UserId = user.Id , ClientId = user.ClientId , LoginProvider = model.Provider , ProviderKey = verifiedAccessToken.user_id } ); if (!result.Succeeded) { return(GetErrorResult(result)); } //generate access token response var accessTokenResponse = GenerateLocalAccessTokenResponse(user); return(Ok(accessTokenResponse)); }