0

除了一个小问题,我有 IDS4 和 Xamarin.Forms 应用程序都可以正常工作。每次 iOS 应用程序访问 IDP 服务器时,它都会首先给我这个提示:

“AppName”想要使用“”登录 这允许应用程序和网站共享有关您的信息

这是什么原因造成的?

在此处输入图像描述

4

1 回答 1

2

我在使用 IdentityModel.OidcClient2 时遇到此错误。请参阅此链接了解原因。这是它的要点:

原因

这是 iOS 11 中添加到SFAuthenticationSession. 它是由 AppAuth 中的这段代码触发的:

SFAuthenticationSession* authenticationVC = 
 [[SFAuthenticationSession alloc] initWithURL:requestURL 
                            callbackURLScheme:redirectScheme 
                            completionHandler:^(NSURL * _Nullable callbackURL, 
                                                NSError * _Nullable error) { 

没有办法摆脱对话框,除了不使用SFAuthenticationSession这意味着你失去单点登录,这更糟。

通过使用 MLeech HERE提到的方法,我最终使用了 SFSafariViewController 而不是 SFAuthenticationSession

解决方案

这基本上意味着将这些行添加到您的 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;
    }
}
于 2019-02-26T14:14:28.023 回答