如何使用环回IP检索身份验证令牌

时间:2019-05-22 18:57:20

标签: c# asp.net-mvc authentication loopback

最近,Google禁止嵌入式浏览器身份验证,以支持Loopback IP方法

我的站点具有一个桌面客户端,该客户端使用与该站点相同的登录系统。基本上,我将嵌入式浏览器视图弹出到我的网站上,并在登录完成后获取Cookie。然后,我的网站的auth cookie被桌面客户端用于API访问。

现在Google禁止使用嵌入式浏览器,为此我需要一种新方法(如果我想维护Google外部登录名)。

如果我理解正确,那么新过程将类似于
1.桌面客户端收听localhost::port
2.桌面客户端启动Url进入网站的登录页面,并打开用户的默认浏览器
3.用户使用自己喜欢的浏览器登录网站
4. Web服务器检测到登录成功,并以某种方式将带有身份验证令牌的重定向发送到localhost::port
5.桌面客户端从本地主机读取令牌

但是,如果重定向URL是localhost,如何显示登录成功页面以指示用户关闭浏览器并返回桌面应用程序?我应该如何在服务器和桌面客户端上实现此功能?

1 个答案:

答案 0 :(得分:0)

找到了两种方法。一种是使用TcpListener并绑定到回送IP。响应以流的形式返回,您需要进一步对其进行解析以获取所需的数据,这是一个巨大的痛苦。

另一种方法是使用HttpListener

        using (HttpListener listener = new HttpListener())
        {
            listener.Prefixes.Add("http://localhost:{port}/"); //Only listen to this particular address
            listener.Start();

            //blocking call. Feel free to use async version
            HttpListenerContext context = listener.GetContext(); 
            HttpListenerRequest request = context.Request;

            HttpListenerResponse response = context.Response;

            //Here is the response url. The token should be inside url query param.
            Console.WriteLine(request.Url); 

            //redirects user back to your site and show a login success screen
            response.Redirect("{yourdomain}/loginsuccess");
            //Important! call close to send out the response
            response.Close();

            //Important! If listener is stopped before response is sent out then it will abort.
            Thread.Sleep(1000);
            listener.Stop();
        }

在服务器端,只需在登录完成后将用户重定向到http://localhost:{port}/?token=xxxx

使用此方法,用户甚至都不会注意到我们已将他/她温和地重定向到了本地主机。浏览器的URL会一直显示您网站的域。