Реализация 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"
Надеюсь, что это помогает кому-то там..