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 был более строгим и где-то внутренне молча отказывался обрабатывать запрос. Однако никаких признаков этого не было ни в каких журналах!
Ситуация разрешилась, когда самозаверяющий сертификат для диспетчера удостоверений был импортирован в хранилище доверенных ЦС и отображен как действительный сертификат.