IdentityServer4: как указать поставщика удостоверений в рамках запроса на авторизацию? - PullRequest
0 голосов
/ 20 марта 2019

Я реализовал IdentityServer4 с внешними провайдерами в моем проекте.Теперь, когда запрашивается страница с ограниченным доступом, пользователь перенаправляется на мою страницу входа в IdentityServer, где он может либо ввести имя пользователя и пароль, либо войти в систему с помощью Google или Facebook.Как я могу указать, какой поставщик удостоверений будет использоваться со стороны клиента, чтобы мой сервер удостоверений напрямую перенаправлял на конкретного поставщика, не показывая страницу входа?

1 Ответ

1 голос
/ 21 марта 2019

Вы можете передать пользовательский параметр в конечную точку авторизации.

Если вы используете промежуточное программное обеспечение OpenID Connect, вы можете добавить значение в строку запроса запроса на авторизацию функции OnRedirectToIdentityProvider:

options.Events.OnRedirectToIdentityProvider = async n =>
            {
                var headerValue = n.HttpContext.Request.Headers["X-idp"];

                n.ProtocolMessage.SetParameter("X-idp", headerValue.ToString());

                await Task.FromResult(0);
            };

Вы можете создать пользовательский атрибут CustomAuthorizeAttribute для передачи провайдера идентификации, который вы хотите авторизовать:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class CustomAuthorizeAttribute : AuthorizeAttribute, IAuthorizationFilter
{
    private readonly string _idp;

    public CustomAuthorizeAttribute(string idp)
    {
        _idp = idp;
    }

    public void OnAuthorization(AuthorizationFilterContext context)
    {
        context.HttpContext.Request.Headers.Add("X-idp", _idp);
    }
}

В вашем контроллере:

[CustomAuthorizeAttribute("AAD")]

Чтобы на стороне Identity Server вы моглиполучить необходимую идентификационную информацию, предоставив информацию через строку запроса:

AccountController.cs (ASP.Net Identity):

[Authorize]
[Route("[controller]/[action]")]
public class AccountController : Controller
{
    private readonly UserManager<ApplicationUser> _userManager;
    private readonly SignInManager<ApplicationUser> _signInManager;
    private readonly IEmailSender _emailSender;
    private readonly ILogger _logger;
    private readonly IIdentityServerInteractionService _interaction;

    public AccountController(
        UserManager<ApplicationUser> userManager,
        SignInManager<ApplicationUser> signInManager,
        IEmailSender emailSender,
        ILogger<AccountController> logger, IIdentityServerInteractionService interaction)
    {
        _userManager = userManager;
        _signInManager = signInManager;
        _emailSender = emailSender;
        _logger = logger;
        _interaction = interaction;
    }

    [TempData]
    public string ErrorMessage { get; set; }

    [HttpGet]
    [AllowAnonymous]
    public async Task<IActionResult> Login(string returnUrl = null)
    {

        var context = await _interaction.GetAuthorizationContextAsync(returnUrl);
        var idp = context.Parameters["X-idp"];

        var redirectUrl = Url.Action(nameof(ExternalLoginCallback), "Account", new { returnUrl });
        var properties = _signInManager.ConfigureExternalAuthenticationProperties(ipd, redirectUrl);
        return Challenge(properties, idp);

        //var customId = HttpContext.Request.Query["X-CustomId"].ToString();
        //var queryString = HttpContext.Request.Query["returnUrl"].ToString();
        //// Clear the existing external cookie to ensure a clean login process
        //await HttpContext.SignOutAsync(IdentityConstants.ExternalScheme);

        //ViewData["ReturnUrl"] = returnUrl;
        //return View();
    }

    .....
}

В приведенном выше примере кода используется IIdentityServerInteractionService метод GetAuthorizationContextAsync дляполучить значение, если у вас есть внешний поставщик, например:

services.AddAuthentication()
   .AddOpenIdConnect("AAD", "Azure Active Directory", options =>
   {
       options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;
       options.SignOutScheme = IdentityServerConstants.SignoutScheme;
       options.Authority = "https://login.microsoftonline.com/xxxx.onmicrosoft.com";
       options.ClientId = "xxxxxxxxxxxxxxxxxxxxxxxxxx";
       options.Scope.Add("openid");

   });

Он найдет эту схему аутентификации по имени AAD и запустит процесс входа в Azure AD.

...