C# webapp не получает токен OAuth при публикации в IIS

Мы пытаемся оценить несколько провайдеров идентификации. Для настройки POC было написано небольшое веб-приложение, использующее IdentityModel. Он может успешно аутентифицироваться и авторизоваться при локальном запуске с текущим провайдером идентификации (по крайней мере, как мне сказали). Он работает правильно с ноутбука разработчика, используя Visual Studio и IIS Express.

Проблемы начинаются, когда я публикую приложение вне среды разработки в POC. Приложение отправляет имя пользователя / пароль и успешно инициирует сеанс, но не получает токен авторизации. В результате веб-приложение останавливается с исключением нулевого токена.

IIS запускает приложение на том же порту и хосте, что и в среде разработки: https://localhost:44307/, используя тот же самозаверяющий сертификат SSL.

Куда копать дальше? В чем может быть неправильная конфигурация IIS или что-то в приложении?

С Keycloak мы определили, что проблема может быть связана с учетными данными авторизации OAuth, отправляемыми заголовками, но WSO2, кажется, принимает и методы тела и заголовка. Мне удалось проверить функциональность службы идентификации с помощью Postman и получить токены, поэтому служба идентификации должна работать.

В журналах WSO2 нет ошибок. Записи журнала показывают только то, что для URL обратного вызова выдается код авторизации. Ничего о маркере.

public async Task<RedirectResult> LoggedIn()
{
    var authorizeResponse = new AuthorizeResponse(Request.RawUrl);

    // Create the TokenClient
    var client = new TokenClient(
    TokenEndpoint,
    ClientId,
    ClientSecret);

    // Request the access token
    var response = await client.RequestAuthorizationCodeAsync(
    authorizeResponse.Code,
    RedirectUrl);

    System.IO.File.AppendAllText(AppDomain.CurrentDomain.BaseDirectory + "\\log.txt", response.Raw + "\n");
    var claims = ValidateLocally
        ? ValidateWithHmacOrRsa(response.AccessToken)
        : await ValidateWithUserInfoEndpointAsync(response.AccessToken);

    Session["claims"] = claims;
    Session["identityToken"] = response.IdentityToken;

    return Redirect("~/");
}

Ожидается получение токена авторизации для клиента OAuth. Вместо этого в журнале отладки приложения я вижу:

Connection=close&Accept=text/html,application/xhtml xml,application/xml;q=0.9,*/*;q=0.8&Accept-Encoding=gzip, deflate, br&Accept-Language=en-US,en;q=0.5&Host=localhost:44307&Referer=https://wso2-1.wso.local:9443/authenticationendpoint/login.do?client_id=gfvUfDTN7bnfJkWW2Z4wXvAV9Dsa&commonAuthCallerPath=/oauth2/authorize&forceAuth=false&passiveAuth=false&redirect_uri=https://localhost:44307/auth/loggedin&response_type=code&scope=openid&tenantDomain=carbon.super&sessionDataKey=687f20cf-7224-4586-8a97-b11e466ac19d&relyingParty=gfvUfDTN7bnfJkWW2Z4wXvAV9Dsa&type=oidc&sp=hellome-local&isSaaSApp=false&authenticators=BasicAuthenticator:LOCAL&TE=trailers&User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0&upgrade-insecure-requests=1

Показывает журнал событий браузера и Windows

Exception Details: System.ArgumentNullException: Value cannot be null.
Parameter name: token
...
Stack Trace:

[ArgumentNullException: Value cannot be null.
Parameter name: token]
   IdentityModel.Client.<GetAsync>d__6.MoveNext() +795
   System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() +31
...

1 ответ

Решение

Дело закрыто. И проблема была в самозаверяющем сертификате Identity Manager. IIS Express с радостью проигнорировал это, но IIS был более строгим и где-то внутренне молча отказывался обрабатывать запрос. Однако никаких признаков этого не было ни в каких журналах!

Ситуация разрешилась, когда самозаверяющий сертификат для диспетчера удостоверений был импортирован в хранилище доверенных ЦС и отображен как действительный сертификат.

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