IdentityServer4 и OidcClient в командной строке IOS - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть IDS4 и приложение Xamarin.Forms, все работает нормально, кроме одной маленькой проблемы.Каждый раз, когда приложение iOS обращается к серверу IDP, оно сначала выдает мне следующее приглашение:

"AppName" хочет использовать "" для входа в систему. Это позволяет приложению и веб-сайту обмениваться информацией о вас

Что вызывает это?

enter image description here

1 Ответ

0 голосов
/ 26 февраля 2019

У меня есть эта ошибка с использованием 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 HERE

Solution

Что означало добавить эти строки в ваш 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;
    }
}
...