Интеграция утверждений авторизации (например, Facebook), токенов аутентификации с внутренней учетной записью пользователя - PullRequest
0 голосов
/ 02 июня 2019

В моем приложении пользователь должен войти в приложение и затем авторизовать Facebook (нажав кнопку в защищенной области), чтобы приложение могло получать сообщения в Facebook и т. Д. Вот код, который я написал для сохранения претензий итокены аутентификации и подключите их к внутренней учетной записи пользователя.

Следую ли я правильному подходу?Если нет, то было бы проще напрямую вставлять записи в таблицы AspNetUserClaims, AspNetUserTokens для заявок, токенов аутентификации, используя ядро ​​Entity Framework.

public async Task<IActionResult> OnGetCallbackAsync(string returnUrl = null, string remoteError = null)
    {
      returnUrl = returnUrl ?? Url.Content("~/");
      if (remoteError != null)
      {
        ErrorMessage = $"Error from external provider: {remoteError}";
        return RedirectToPage("./Settings", new { ReturnUrl = returnUrl });
      }
      // Get the information about the user from the external login provider
      var identityUser = await UserManager.GetUserAsync(User);
      var externalLoginInfo = await SignInManager.GetExternalLoginInfoAsync();
      if (externalLoginInfo == null)
      {
        ErrorMessage = "Error loading external login information during confirmation.";
        return RedirectToPage("./Settings", new { ReturnUrl = returnUrl });
      }
      var applicationUser = new ApplicationUser { UserName = identityUser.Email, Email = identityUser.Email , SecurityStamp= Guid.NewGuid().ToString()};
      var identityResult = await this.UserManager.AddLoginAsync(applicationUser, externalLoginInfo);
      if (identityResult.Succeeded)
      {
        if (externalLoginInfo.Principal.HasClaim(c => c.Type == ClaimTypes.GivenName))
        {
          await this.UserManager.AddClaimAsync(applicationUser, externalLoginInfo.Principal.FindFirst(ClaimTypes.GivenName));
        }
        identityResult = await SignInManager.UpdateExternalAuthenticationTokensAsync(externalLoginInfo);

        var authenticationProperties = new AuthenticationProperties();
        authenticationProperties.StoreTokens(externalLoginInfo.AuthenticationTokens);
        //authenticationProperties.IsPersistent = true;
        #endregion    
        return LocalRedirect(returnUrl);
      }
      foreach (var error in identityResult.Errors)
      {
        ModelState.AddModelError(string.Empty, error.Description);
      }
      LoginProvider = externalLoginInfo.LoginProvider;
      ReturnUrl = returnUrl;
      return Page();
    }
    #endregion
  }
...