Как получить удостоверение токена доступа после проверки внешних входов в asp.net Веб-API MVC

#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  };  }  

Пожалуйста, подскажите мне, что я делаю не так, и, пожалуйста, помогите мне найти решение.

Спасибо.