为了使我了解OAuth2的实际工作方式,我编写了一个具有/authorize
和/token
端点的模拟身份服务(ASP.NET Core 3)。我还编写了一个Xamarin iOS测试客户端,以了解所有工作原理。客户端使用典型的OAuth2授权码授予请求调用授权(/authorize
)端点,并传递所有必需的查询参数,例如clientId
,clientSecret
等(等等),和redirect_uri
。
由于我的授权服务接受了请求(仅用于测试,因此这里的信任或实际安全性不是问题...),它发出授权代码,并将其作为查询参数通过302(重定向)发送回给已通过redirect_uri
。假设redirect_uri = "callme://authcode"
我为Xamarin iOS客户端(info.plist)添加了“ callme
”作为自定义URI方案,并继续覆盖AppDelegate.OpenUrl
来捕获来自Safari的重定向。>
在Safari将重定向到callme://authcode
之前,一切似乎都可以正常工作。弹出一个对话框,询问用户是否有权打开测试客户端应用程序,而不是简单地调用覆盖的AppDelegate.OpenUrl
。但是,即使我接受了导航请求,也没有任何其他反应,并且几秒钟后,iOS 13(在模拟器中)由于某种原因将我的应用程序杀死了。
我以前将ADAL用于基于Azure的OAuth2授予流程,效果很好,但是我做的事情与ADAL有所不同,因为我得到了不同的行为。
有人可以帮助我了解Safari和iOS中的情况吗?为何Safari要求允许打开打开原始请求的应用程序(ADAL不会发生这种情况),为什么不调用AppDelegate.OpenUrl
?
我可能会错过重定向流程中的细微差别吗?