ASP.NET Core Связать внешний вход в систему с IdentityUser без Razor Pages - PullRequest
0 голосов
/ 11 мая 2019

Я пытаюсь добавить аутентификацию GitHub в мое приложение ASP.NET Core, чтобы определенные пользователи имели роль администратора. Эту роль я хочу реализовать через IdentityRole, а пользователи должны храниться как IdentityUser s.

Я использовал информацию из этого поста в качестве отправной точки.

Я настроил аутентификацию через GitHub так:

services
    .AddAuthentication()
    .AddGitHub(options =>
    {
        options.ClientId = "xxx";
        options.ClientSecret = "xxx";
    }) 

И мой метод Sigin в контроллере здесь:

public IActionResult SignIn(string provider, string returnUrl = null) =>
            Challenge(new AuthenticationProperties { RedirectUri = returnUrl ?? "/" }, provider);

И я могу получить претензии GitHub через этот код:

public IActionResult Index()
{
    var vm = new ProfileViewModel
    {
        Claims = User.Claims,
        Name = User.Identity.Name
    };
    return View(vm);
}

Все работает и все хорошо, но это ClaimsPrincipal не IdentityUser. И я не понимаю, как я могу создать новый или идентифицировать ранее сохраненный IdentityUser, используя эту претензию. Вот набор статей от Microsoft об использовании внешних входов в систему, но они использовали страницы Razor и не предоставляют много информации, как это на самом деле связывается с IdentityUser.

Как я могу сделать то же самое без использования страниц Razor?

1 Ответ

0 голосов
/ 13 мая 2019

Чтобы отобразить пользователя github на пользователя с идентификатором, необходимо создать пользователя с идентификатором.

Для создания страницы IdentityUser без Razor необходимо составить запрос на отправку необходимой информации на ExternalLoginConfirmation.

[HttpGet]
[AllowAnonymous]
public async Task<IActionResult> ExternalLoginCallback(string returnUrl = null, string remoteError = null)
{
    if (remoteError != null)
    {
        ErrorMessage = $"Error from external provider: {remoteError}";
        return RedirectToAction(nameof(Login));
    }
    var info = await _signInManager.GetExternalLoginInfoAsync();
    if (info == null)
    {
        return RedirectToAction(nameof(Login));
    }

    // Sign in the user with this external login provider if the user already has a login.
    var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false, bypassTwoFactor: true);
    if (result.Succeeded)
    {
        _logger.LogInformation("User logged in with {Name} provider.", info.LoginProvider);
        return RedirectToLocal(returnUrl);
    }
    if (result.IsLockedOut)
    {
        return RedirectToAction(nameof(Lockout));
    }
    else
    {
        // If the user does not have an account, then ask the user to create an account.
        ViewData["ReturnUrl"] = returnUrl;
        ViewData["LoginProvider"] = info.LoginProvider;
        var email = info.Principal.FindFirstValue(ClaimTypes.Email);
        return View("ExternalLogin", new ExternalLoginViewModel { Email = email });
    }
}

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<IActionResult> ExternalLoginConfirmation(ExternalLoginViewModel model, string returnUrl = null)
{
    if (ModelState.IsValid)
    {
        // Get the information about the user from the external login provider
        var info = await _signInManager.GetExternalLoginInfoAsync();
        if (info == null)
        {
            throw new ApplicationException("Error loading external login information during confirmation.");
        }
        var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
        var result = await _userManager.CreateAsync(user);
        if (result.Succeeded)
        {
            result = await _userManager.AddLoginAsync(user, info);
            if (result.Succeeded)
            {
                await _signInManager.SignInAsync(user, isPersistent: false);
                _logger.LogInformation("User created an account using {Name} provider.", info.LoginProvider);
                return RedirectToLocal(returnUrl);
            }
        }
        AddErrors(result);
    }

    ViewData["ReturnUrl"] = returnUrl;
    return View(nameof(ExternalLogin), model);
}
.
...