Macos 从Mac(Xamarin)登录到Microsoft Graph API

Macos 从Mac(Xamarin)登录到Microsoft Graph API,macos,xamarin.mac,visual-studio-mac,Macos,Xamarin.mac,Visual Studio Mac,我正在尝试将我的Mac应用程序(用c#/Visual Studio for Mac编写)连接到Microsoft的Graph API 在Windows上,我可以使用ADAL并执行以下操作: PublicClientApplication myApp = new PublicClientApplication(MYID); string Scope = "User.ReadBasic.All User.Read"; var result = awai

我正在尝试将我的Mac应用程序(用c#/Visual Studio for Mac编写)连接到Microsoft的Graph API

在Windows上,我可以使用ADAL并执行以下操作:

        PublicClientApplication myApp = new PublicClientApplication(MYID);
        string Scope = "User.ReadBasic.All User.Read";
        var result = await myApp.AcquireTokenAsync(Scope.Split(' '));
        return result.AccessToken;
而Mac上的相同方法会导致“未实现”异常

我尝试了几种方法,比如SimpleAuth的ADFSApi和MicrosoftLiveConnectApi,但没有成功

有人知道如何进行此验证吗?另一方面,我经常发现使用浏览器的指南。。。如何使用代码从应用程序读取浏览器的响应以获取令牌

-------------更新---------------------

工作数小时后,我实现了另一种流程。基本上,当按下登录按钮时,我会执行一个只包含WebView的窗口的切换

public override void ViewDidLoad()
    {
        base.ViewDidLoad();

        var webView = new WebKit.WebView(this.MainView.Frame, "officeWebView", "noName");

        webView.MainFrameUrl = "https://login.microsoftonline.com/common/oauth2/v2.0/authorize?state=ltxzlgtghhxgpwuh&client_id=[MYID]&response_type=code&scope=User.ReadBasic.All%20User.Read&redirect_uri=msal[MYID]://auth";
        webView.FinishedLoad += (sender2, e) =>
        {
            var url = ((WebKit.WebView)sender2).MainFrameUrl;
        };

        this.MainView.AddSubview(webView);
    }
登录结束时,系统会提示我一条消息,如“没有可打开MSAL[MYID]的应用程序等。因此,我在info.plist中添加了“绑定”

其中,URL方案实际上是MSAL[MYID]

我在AppDelegate.cs中实现了OpenURL方法

 public override void OpenUrls(NSApplication application, NSUrl[] urls)
    {
        Console.WriteLine("TEST!!!");
        foreach(var url in urls)
            Console.WriteLine(url);

        base.OpenUrls(application, urls);
    }
但OpenURL似乎从未被触发(从未打印过一行,从未命中断点)


怎么了?如果我成功地做到了这一点,我如何才能转移到隐式授权以保证我的应用程序的安全?

我不知道您的具体情况。但是您可以使用WebKit.WebView

在我的例子中,我通过自己的网站使用facebook登录,并通过重定向url将facebook令牌传递回

分配FrameLoadDelegate

webView.FrameLoadDelegate = this;
webView.MainFrameUrl = starturlhere;
实现webView:didFinishLoadForFrame:

    [Export ("webView:didFinishLoadForFrame:")]
    public void FinishedLoad (WebKit.WebView sender, WebKit.WebFrame forFrame)
    {
        // page loaded
        System.Diagnostics.Debug.WriteLine("FinishedLoad: "+sender.MainFrameUrl);

        var url = new NSUrl(sender.MainFrameUrl);
        var document = sender.MainFrameDocument;

        // check if this is the login result 
        // if not do nothing and return (login flow not done)
    }
从url或加载的页面提取所需数据

//更新

如果未通过您自己的服务器登录。请为(或任何真正的)设置重定向url,并使用以下其中一项截获重定向(检查正确的url):


我正在尝试这样做,几乎成功了。但在登录的最后一部分,我开始出现以下错误:NSURLSession/NSURLConnection HTTP加载失败(kCFStreamErrorDomainSSL,-9800)。我已经在info.plist中添加了允许不安全连接的所有标志,但它似乎不起作用允许登录流上的不安全连接?但没有更多细节,很难说。kCFStreamErrorDomainSSL上有许多帖子,但这是一个不同的问题。我解决了向OAuth Auth调用添加重定向URI的错误。现在stem应该调用我的OpenURL方法,但它没有被触发。我正在添加问题的内容,以便更容易理解。也许你可以重定向到127.0.0.1 localhost并从webview中捕获url。那时不需要OpenURL。效果非常好!谢谢!附言:我试图构建一个全新的项目和“info.plist”“这些东西起作用了。所以它必须与其他插件或以前的应用程序配置相关
        webView.ReceivedServerRedirectForProvisionalLoad += (object sender, WebFrameEventArgs e) => 
        {
            //e.ForFrame.ProvisionalDataSource.Request.Url;
        };

        webView.OnSendRequest += (WebView sender, NSObject identifier, NSUrlRequest request, NSUrlResponse redirectResponse, WebDataSource dataSource) => 
        {
            //request.Url;
        };