Авторизация в ASP.NET Core 2.0 через провайдера openid - PullRequest
0 голосов
/ 04 июня 2018

У меня проблемы с передачей претензий из внешнего удостоверения в локальное.Приложение в основном представляет собой QuickBooksASPNetCore2 Demo с добавленным идентификатором openid.Все работает, кроме

[Authorize (Role = "some_role")] *

на тестовой странице Razer.

Это кодкоторый выполняет логику входа в систему, и

_signInManager.GetExternalLoginInfoAsync ();

возвращает принципала со всеми утверждениями от поставщика удостоверений (включая роли в «»)http://schemas.microsoft.com/ws/2008/06/identity/claims/role" type).

дамп информации var с утверждениями

 public async Task<IActionResult> OnGetCallbackAsync(string returnUrl = null, string remoteError = null)
    {
        if (remoteError != null)
        {
            ErrorMessage = $"Error from external provider: {remoteError}";
            return RedirectToPage("./Login");
        }
        var info = await _signInManager.GetExternalLoginInfoAsync();
        if (info == null)
        {
            return RedirectToPage("./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: true, bypassTwoFactor : true);
        if (result.Succeeded)
        {
            _logger.LogInformation("{Name} logged in with {LoginProvider} provider.", info.Principal.Identity.Name, info.LoginProvider);
            await _signInManager.UpdateExternalAuthenticationTokensAsync(info);
            return LocalRedirect(Url.GetLocalUrl(returnUrl));
        }
        if (result.IsLockedOut)
        {
            return RedirectToPage("./Lockout");
        }
        else
        {
            // If the user does not have an account, then ask the user to create an account.
            ReturnUrl = returnUrl;
            LoginProvider = info.LoginProvider;
            if (info.Principal.HasClaim(c => c.Type == ClaimTypes.Email))
            {
                Input = new InputModel
                {
                    Email = info.Principal.FindFirstValue(ClaimTypes.Email)
                };
            }
            return Page();
        }
    }

Но при выходе из этого метода страница User.Claims на Razor не имеетроль претендует. Она даже получает новую заявку "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier" (с другим идентификатором).Я что-то здесь упустил?

1 Ответ

0 голосов
/ 05 июня 2018

Таким образом, если у кого-то возникнет эта проблема, вам необходимо сопоставить утверждения из внешнего идентификатора с идентификатором локального приложения.

Это означает заменить строку

var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: true, bypassTwoFactor : true);

на

var user = await _userManager.FindByLoginAsync(info.LoginProvider, info.ProviderKey);
var claimsPrincipal = await this._signInManager.CreateUserPrincipalAsync(user);
((ClaimsIdentity)claimsPrincipal.Identity).AddClaims(info.Principal.Claims.Where(c => c.Type == ClaimTypes.Role));

await HttpContext.SignInAsync("Identity.Application", claimsPrincipal);

Все заявки, которые вам нужны в приложениях, необходимо сопоставить вручную с помощью метода AddClaim (s) из внешнего удостоверения.

...