Реализация Jasig CAS в.NET

Я использую веб-формы на.net 4.0 и действительно изо всех сил пытаюсь заставить это работать. Я использовал документацию с сайта jasig и установил пакет nuget для клиента.

https://wiki.jasig.org/display/CASC/.Net+Cas+Client

Я успешно вхожу в систему и получаю токен с сервера CAS, но не могу его подтвердить. Насколько я вижу, для проверки токена нужно вызвать три разных сервисных метода:

/ проверки

/ serviceValidate

/ samlValidate

Метод validate просто возвращает веб-ответ "нет", а когда я вызываю метод serverValidate, он возвращает код INVALID_TICKET в ответе XML. Я пробовал также samlValidate, но получаю ошибку 403 (я понимаю, что это потенциально допустимый ответ).

Мой проверочный код выглядит примерно так:

 var validateurl = APPLICATION + "validate?" +
                    "ticket=" + tkt + "&" +
                    "service=" + service;


  StreamReader Reader = new StreamReader(new WebClient().OpenRead(validateurl));
  string resp = Reader.ReadToEnd();

Мой конфиг CAS:

<casClientConfig casServerLoginUrl="https://*IPSERVER*/cas/login"
                   casServerUrlPrefix="https://*IPSERVER*/cas/"
                   serverName="http://*MYSITE*/"
            notAuthorizedUrl="~/NotAuthorized.aspx"
                   cookiesRequiredUrl="~/CookiesRequired.aspx"
                   redirectAfterValidation="true" gateway="false" renew="false" singleSignOut="true"
                   ticketTimeTolerance="5000" ticketValidatorName="Cas20" proxyTicketManager="CacheProxyTicketManager"
           serviceTicketManager="CacheServiceTicketManager"
           gatewayStatusCookieName="CasGatewayStatus" />

Я полагаю, что это должна быть какая-то настройка, но для жизни я не могу понять, какой может быть настройка.

Может кто-нибудь сказать мне, почему я не могу проверить токен?

Изменить: Подумав об этом немного больше, я еще больше запутался. Если, как сказано в @Steven V ниже, cookie -файл клиентского приложения создается модулем http - как проходит аутентификация любой страницы? Например, если я нахожусь на своей странице приложения клиента (RP) (скажем, landing.aspx) и щелкаю ссылку на сервер аутентификации (IP) с ограниченным содержимым (скажем, limited.aspx) - как сервер волшебным образом создает cookie на клиенте, прежде чем он будет перенаправлен на rest.aspx после входа в систему. Используя WIF, мне все равно придется сделать FormsAuthentication.CreateAuthCookie() или похожий в коде.

Что происходит, если я нажимаю на ссылку на страницу с ограниченным доступом, то я перенаправлен на страницы сервера (IP) CAS, как и ожидалось, и после успешного входа в систему получаем бесконечное перенаправление, поскольку, по-видимому, приложение не имеет локального файла cookie клиента и пытается аутентифицироваться, поэтому перенаправляет на сервер, который уже аутентифицирован, и перенаправляет обратно клиенту, у которого нет локального куки, поэтому он должен аутентифицироваться.. навсегда.

Отредактируйте снова: я прочитал далее об этом (там не так много доступного) и обнаружил, что эта аутентификация происходит на очень низком уровне и должна происходить в клиентском приложении (RP), устанавливающем cookie перед перенаправлением страницы. Это явно не происходит для меня, и я понятия не имею, как решить, что идет не так.

1 ответ

Решение

В итоге мне пришлось скачать исходный код для клиента Jasig CAS и внедрить новый валидатор билетов. Используемый нами IP-адрес - ECAS, Служба аутентификации Европейской комиссии, и он не поддерживает уровень разрешений моего клиента.

Для тех, кто заинтересован, или тех, кто пытается подключиться к ECAS (.NET не является одной из их поддерживаемых платформ). В клиенте.NET в папке /Validation/Schema/TicketValidator вы можете реализовать что-то вроде:

namespace DotNetCasClient.Validation.TicketValidator
{
    internal class ECasServiceTicketValidator : Cas20ServiceTicketValidator
    {

В файл CasAuthentication.cs вам нужно добавить следующие фрагменты:

        // Names for the supported ticket validators
        public const string CAS10_TICKET_VALIDATOR_NAME = "Cas10";
        public const string CAS20_TICKET_VALIDATOR_NAME = "Cas20";
        public const string ECAS_TICKET_VALIDATOR_NAME = "ECas";
        public const string SAML11_TICKET_VALIDATOR_NAME = "Saml11";

А также

if (String.Compare(ticketValidatorName, CasClientConfiguration.CAS10_TICKET_VALIDATOR_NAME, true) == 0)
                        {
                            ticketValidator = new Cas10TicketValidator();
                        }
                        else if (String.Compare(ticketValidatorName, CasClientConfiguration.CAS20_TICKET_VALIDATOR_NAME, true) == 0)
                        {
                            ticketValidator = new Cas20ServiceTicketValidator();
                        }
                        else if (String.Compare(ticketValidatorName, CasClientConfiguration.ECAS_TICKET_VALIDATOR_NAME, true) == 0)
                        {
                            ticketValidator = new ECasServiceTicketValidator();
                        } 
                        else if (String.Compare(ticketValidatorName, CasClientConfiguration.SAML11_TICKET_VALIDATOR_NAME, true) == 0)
                        {
                            ticketValidator = new Saml11TicketValidator();
                        }

Затем в настройке casConfigClient в web.config веб-сайта добавьте следующее:

ticketValidatorName="ECas"

Надеюсь, что это помогает кому-то там..

Другие вопросы по тегам