Identityserver4 с ComponentSpace SAML 2 получить пользовательские параметры во время запроса - PullRequest
0 голосов
/ 24 октября 2018

Я использую IdentityServer4 с двумя внешними Idp, один с WSFederation (ADFS) и один с SAML.

Для реализации SAML я использую коммерческий продукт ComponentSpace SAML 2 для ASP.Net Core.Я использую конфигурацию на основе промежуточного программного обеспечения.

Ведение журнала с обоими работами Idp идеально, но теперь у меня есть ситуация, когда, в зависимости от клиента, мне нужно передать дополнительные параметры в SAML AuthnRequest.Я знаю, как передать этот дополнительный параметр в запросе (я могу использовать OnAuthnRequest, созданный из промежуточного программного обеспечения), но я не знаю, как проверить в тот момент, откуда поступает запрос, то есть с какого клиента.

У меня есть контроль над клиентом, поэтому я также мог передать дополнительные acr_values ​​(которые, я думаю, можно использовать для передачи пользовательских данных), но опять же я не знаю, как получить их в событии OnAuthnRequestCreated, как показано в кодениже.

Любая помощь будет высоко ценится.

services.AddSaml(Configuration.GetSection("SAML"));

services.AddAuthentication()
            .AddWsFederation("adfs", options =>
            {
                options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;
                //...rest of config (SSO is working)
            })
            .AddSaml("saml", options =>
            {
                options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;
                //...rest of config (SSO is working)

                options.OnAuthnRequestCreated = request =>
                {                      
                    //Here I would need to know from which client the request is coming (either by client name or url or acr_values or whatever)
                    //to be able to perform conditional logic. I've checked on the request object itself but the info is not in there

                    return request;
                };
            });

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Спасибо ComponentSpace за ответ.Я не заставил его работать непосредственно с вашим решением с помощью app.Use ((context, next)) => ... но ваш комментарий к GetRequiredService указал мне направление, чтобы найти решение, как показано ниже.По сути, я получаю IHttpContextAccessor, который затем могу использовать для анализа строки запроса.Затем я получаю ReturnUrl из этой строки запроса и использую IIdentityServerInteractionService для получения объекта AuthorizationContext, который содержит то, что мне нужно для построения моей пользовательской логики.

Так что еще раз спасибо за указание в правильном направлении.

//build and intermediate service provider so we can get already configured services further down this method
var sp = services.BuildServiceProvider();

services.AddAuthentication()
            .AddSaml("SamlIdp", options =>
            {
                options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;

                options.OnAuthnRequestCreated = request =>
                {
                    var httpContextAccessor = sp.GetService<IHttpContextAccessor>();
                    var queryStringValues = HttpUtility.ParseQueryString(httpContextAccessor.HttpContext.Request.QueryString.Value);

                    var interactionService = sp.GetService<IIdentityServerInteractionService>();
                    var authContext = interactionService.GetAuthorizationContextAsync(queryStringValues["ReturnUrl"]).Result;

                    //authContext now contains client info and other useful stuff to help build further logic to customize the request

                    return request;
                };
            });
0 голосов
/ 25 октября 2018

Параметром запроса является объект SAML AuthnRequest.Он не включает информацию о клиенте и т. Д.

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

app.Use((context, next) =>
{
    var samlServiceProvider =
        context.RequestServices.GetRequiredService<ISamlServiceProvider>();

    samlServiceProvider.OnAuthnRequestCreated += authnRequest =>
    {
        // Update authn request as required.

        return authnRequest;
    };

    return next();
});
...