#c# #asp.net #asp.net-mvc #asp.net-web-api #asp.net-identity
Вопрос:
Я создаю API для внешних входов в систему.
итак, здесь я сначала проверяю внешние логины, а после проверки пользователей вставляю пользователей в таблицу AspNetUsers и добавляю ключи поставщика в таблицы AspNetUserLogins.
затем, после того как мне понадобится токен доступа с помощью электронной почты и ключа поставщика, введите asp.net Веб-API идентификации MVC.
Я попробовал приведенный ниже способ получить токен доступа, но он не работает.
[OverrideAuthentication] [HostAuthentication(DefaultAuthenticationTypes.ExternalCookie)] [AllowAnonymous] //[Route("DTS_ExternalLogin")] [Route("DTS_ExternalLogin", Name = "DTS_ExternalLogin")] public async Tasklt;IHttpActionResultgt; ExternalLogin(ExternalLoginModel model) { TokenSearch tokenSearch = new TokenSearch(); ResponceStatus objResponceStatus = new ResponceStatus(); if (!ModelState.IsValid) { return GenerateBadRequestFromModelState(ModelState); } var objuser = await UserManager.FindByNameAsync(model.Email); if (objuser == null) { string ProviderUserId = ""; if (model.LoginType == "Google") { var LoginUser = ValidateGoogleToken(model.UniqueToken); if (LoginUser == null) return GenerateBadRequestFromString("Token is not valid."); else ProviderUserId = LoginUser.ProviderUserId; } else if (model.LoginType == "Facebook") { var LoginUser = ValidateFBToken(model.UniqueToken); if (LoginUser == null) return GenerateBadRequestFromString("Token is not valid."); else ProviderUserId = LoginUser.ProviderUserId; } else return GenerateBadRequestFromString("Invalid login type."); var user = new ApplicationUser { UserName = model.Email, Email = model.Email,EmailConfirmed=true }; var result = await UserManager.CreateAsync(user); if (result.Succeeded) { try { SQL_Data_Helper.InsertNewUser(user.Id); SQL_Data_Helper.InsertProviderKey(user.Id, model.LoginType, ProviderUserId); //IdentityResult result2 = await UserManager.AddLoginAsync(user.Id,new UserLoginInfo(model.LoginType, ProviderUserId)); //if (!result.Succeeded) //{ // var resultDelete = await UserManager.DeleteAsync(user); // return GetErrorResult(result); //} } catch (Exception ex) { var resultDelete = await UserManager.DeleteAsync(user); return GenerateBadRequestFromString(ex.Message); } } objuser = await UserManager.FindByNameAsync(model.Email); } //ApplicationUser user_Auth = await UserManager.FindAsync(new UserLoginInfo(model.LoginType, // model.UserID)); //bool hasRegistered = user_Auth != null; //Authentication.SignOut(DefaultAuthenticationTypes.ExternalCookie); //ClaimsIdentity oAuthIdentity = await user_Auth.GenerateUserIdentityAsync(UserManager, // OAuthDefaults.AuthenticationType); //ClaimsIdentity cookieIdentity = await user_Auth.GenerateUserIdentityAsync(UserManager, // CookieAuthenticationDefaults.AuthenticationType); //AuthenticationProperties properties = ApplicationOAuthProvider.CreateProperties(user_Auth.UserName); //Authentication.SignIn(properties, oAuthIdentity, cookieIdentity); var bearerToken = GetAccessToken(); //I need the current user access token here. objResponceStatus.Status = "Success"; tokenSearch.responceStatus = objResponceStatus; tokenSearch.bearerToken = bearerToken; return Ok(bearerToken); } private const string GoogleApiTokenInfoUrl = "https://www.googleapis.com/oauth2/v3/tokeninfo?id_token={0}"; private const string FBApiTokenInfoUrl = "https://graph.facebook.com/me?access_token={0}"; public ProviderUserDetails ValidateGoogleToken(string providerToken) { var httpClient = new HttpClient(); var requestUri = new Uri(string.Format(GoogleApiTokenInfoUrl, providerToken)); HttpResponseMessage httpResponseMessage; try { httpResponseMessage = httpClient.GetAsync(requestUri).Result; } catch (Exception ex) { return null; } if (httpResponseMessage.StatusCode != HttpStatusCode.OK) { return null; } var response = httpResponseMessage.Content.ReadAsStringAsync().Result; var googleApiTokenInfo = JsonConvert.DeserializeObjectlt;GoogleFBApiTokenInfogt;(response); return new ProviderUserDetails { Email = googleApiTokenInfo.email, FirstName = googleApiTokenInfo.given_name, LastName = googleApiTokenInfo.family_name, Locale = googleApiTokenInfo.locale, Name = googleApiTokenInfo.name, ProviderUserId = googleApiTokenInfo.sub }; } public ProviderUserDetails ValidateFBToken(string providerToken) { var httpClient = new HttpClient(); var requestUri = new Uri(string.Format(FBApiTokenInfoUrl, providerToken)); HttpResponseMessage httpResponseMessage; try { httpResponseMessage = httpClient.GetAsync(requestUri).Result; } catch (Exception ex) { return null; } if (httpResponseMessage.StatusCode != HttpStatusCode.OK) { return null; } var response = httpResponseMessage.Content.ReadAsStringAsync().Result; var googleFBApiTokenInfo = JsonConvert.DeserializeObjectlt;GoogleFBApiTokenInfogt;(response); return new ProviderUserDetails { Name = googleFBApiTokenInfo.name, ProviderUserId = googleFBApiTokenInfo.id }; }
Пожалуйста, подскажите мне, что я делаю не так, и, пожалуйста, помогите мне найти решение.
Спасибо.