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;
    }
}
Другие вопросы по тегам