Чтобы понять, как на самом деле работает OAuth2, я написал фиктивный сервис идентификации (ASP. NET Core 3) с конечной точкой /authorize
и /token
. Я также написал тестовый клиент Xamarin iOS, чтобы посмотреть, как все это может сработать. Клиент вызывает конечную точку доступа (/authorize
) с типичным запросом на предоставление кода авторизации OAuth2, передавая все необходимые параметры запроса, такие как clientId
, clientSecret
, etcetera, (et c.) И * 1006. *.
Когда моя служба авторизации принимает запрос (он предназначен только для тестирования, поэтому доверие или реальная безопасность здесь не проблема ...) он выдает код авторизации и отправляет его в качестве параметра запроса через 302 ( перенаправить) назад к пройденному redirect_uri
. Предполагая, что redirect_uri = "callme://authcode"
я добавил «callme
» в качестве пользовательской схемы URI для моего клиента Xamarin iOS (info.plist) и перешел к переопределению AppDelegate.OpenUrl
, чтобы перехватить перенаправление из Safari.
Кажется, все работает нормально, пока Safari не перенаправит на callme://authcode
. Вместо простого вызова переопределенного AppDelegate.OpenUrl
появляется диалоговое окно, запрашивающее у пользователя разрешение на открытие тестового клиентского приложения. Но даже если я принимаю запрос на навигацию, больше ничего не происходит, и через несколько секунд iOS 13 (в симуляторе) по какой-то причине убивает мое приложение.
Ранее я использовал ADAL для Azure -обеспеченного OAuth2-гранта. потоки, которые работали нормально, но я должен делать что-то не то, что ADAL, потому что у меня другое поведение.
Может кто-нибудь помочь мне понять, что происходит в Safari и iOS? Почему Safari запрашивает разрешение на открытие приложения, которое инициировало исходный запрос (этого не происходит с ADAL), и почему AppDelegate.OpenUrl
не вызывается?
Есть ли какие-либо нюансы в потоке перенаправления, которые я мог бы пропустили?