IdentityServer4 и OidcClient в командной строке IOS
У меня есть IDS4 и приложение Xamarin.Forms, все работает нормально, за исключением одной маленькой проблемы. Каждый раз, когда приложение iOS обращается к серверу IDP, оно сначала выдает мне следующее приглашение:
"AppName" хочет использовать "" для входа в систему Это позволяет приложению и веб-сайту обмениваться информацией о вас
Чем это вызвано?
1 ответ
У меня есть эта ошибка, используя IdentityModel.OidcClient2. Пожалуйста, смотрите эту ссылку для причины. Это суть этого:
причина
Это системный диалог, который был добавлен в iOS 11 для SFAuthenticationSession
, Это вызвано этим кодом в AppAuth:
SFAuthenticationSession* authenticationVC =
[[SFAuthenticationSession alloc] initWithURL:requestURL
callbackURLScheme:redirectScheme
completionHandler:^(NSURL * _Nullable callbackURL,
NSError * _Nullable error) {
Нет способа избавиться от диалога, кроме как не использовать SFAuthenticationSession
что означает, что вы теряете Single SignOn, что еще хуже.
В итоге я использовал SFSafariViewController вместо SFAuthenticationSession, используя метод, упомянутый MLeech ЗДЕСЬ
Решение
Что в основном означало добавить эти строки в ваш AppDelegate.cs
public override UIWindow Window
{
get;
set;
}
public static Action<string> CallbackHandler { get; set; }
public override bool OpenUrl(UIApplication application, NSUrl url, string sourceApplication, NSObject annotation)
{
CallbackHandler(url.AbsoluteString);
CallbackHandler = null;
return true;
}
Затем используйте этот код для вашего SFAuthenticationSessionBrowser.cs
public class SFAuthenticationSessionBrowser : IBrowser
{
public Task<BrowserResult> InvokeAsync(BrowserOptions options)
{
var task = new TaskCompletionSource<BrowserResult>();
var safari = new SFSafariViewController(new NSUrl(options.StartUrl));
AppDelegate.CallbackHandler = async url =>
{
await safari.DismissViewControllerAsync(true);
task.SetResult(new BrowserResult()
{
Response = url
});
};
// https://forums.xamarin.com/discussion/24689/how-to-acces-the-current-view-uiviewcontroller-from-an-external-service
var window = UIApplication.SharedApplication.KeyWindow;
var vc = window.RootViewController;
while (vc.PresentedViewController != null)
{
vc = vc.PresentedViewController;
}
vc.PresentViewController(safari, true, null);
return task.Task;
}
}