如何为Microsoft OAuth2提供程序的本机应用程序指定localhost loopback redirect_uri?

时间:2019-06-14 12:18:34

标签: c# oauth-2.0

我有在https://login.live.com/oauth20_authorize.srf端点授权的代码。

调用参数:“ client_id =“ + ClientID +”&scope =“ + someScopes +”&response_type = code&redirect_uri =“ + WebUtility.UrlEncode(” http://localhost:some-port/signin-microsoft“)

http://localhost:port/signin-microsoft在我的应用程序中的https://apps.dev.microsoft.com处注册为重定向URL之一(我必须使用“添加平台->网络”来放置该redirect_url)。

我运行HttpListener(应用程序中的本地Web服务器)来拦截授权代码。然后,我得到代码并将其传递给此端点:

https://login.live.com/oauth20_token.srf

通话参数:“ client_id =“ + ClientID +”&code =“ +代码+”&grant_type = authorization_code&redirect_uri =“ + WebUtility.UrlEncode(” http://localhost:some-port/signin-microsoft“)

这失败,因为缺少ClientSecret。如果我添加ClientSecret,它可以工作,并且我可以访问并刷新令牌。

但是,本机应用程序不应存储和发送OAuth2客户端机密。 ClientSecret仅对于Web应用程序是必需的。

现在是问题所在。 apps.dev.microsoft.com门户不允许我为本机应用程序指定localhost redirect_uri。我只能对Web应用程序执行此操作(在“ Web /重定向URL”部分中)。对于本机应用程序,尝试指定任何URI总是会导致“您的URI必须采用{scheme}:// {domain} / {path}的格式,没有查询字符串参数,并且限制为255个字符。”消息。

我似乎那里只允许使用几个预定义的值(例如https://login.live.com/oauth20_desktop.srf)。即使我在此值中添加或更改任何单个字符,它也不再有效,并且门户网站也不允许我保存更改。仅当我没有基于localhost的redirect_uri时,我才能使用这些预定义的值。这意味着我必须使用获取授权代码的复杂方法(监视浏览器进程等),而不是简单的HttpListener(例如,由Google OAuth2提供程序使用的HttpListener)。

在使用Microsoft OAuth2提供程序时,是否可以将localhost用作redirect_uri,并且仍然不发送ClientSecret?

为什么我不能在apps.dev.microsoft.com门户的本机应用程序/自定义重定向URI中指定其他URL?如果我无论如何都无法添加除已经存在的那些预定义值之外的任何值,此表单的目的是什么?

同样,我将自定义URL添加到同一页面上的Web /重定向URL上没有问题(然后一切正常,只是我需要处理我不想使用的ClientSecret)。

2 个答案:

答案 0 :(得分:0)

您应该注册一个由浏览器调用的环回网址,例如http://127.0.0.1:8000

此外,您的代码也应使用授权代码流的PKCE变体-避免客户机密

我没有在Azure中使用它,但是可以肯定的是它对您有用

我的博客上有关此的一些血腥细节: https://authguidance.com/2018/01/17/desktop-app-how-to-run-the-code-sample/

本机应用程序和OAuth都很棘手-很高兴能为您提供帮助-随时向我询问任何后续问题

答案 1 :(得分:0)

好的,可以在apps.dev.microsoft.com门户的“本机应用程序”部分中作为“自定义重定向URI”添加的URL必须看起来像something.not.http.or.https://something

例如:

pw.oauth2://oauth2redirect

在那里允许使用这种URI(其中pw.oauth2是与您的应用程序关联的URL方案,例如,对于UWP应用程序,则是Package Manifest /声明/协议/名称)。这不完全是localhost环回,但这可以让您的应用被浏览器触发以拦截授权代码。并且不需要ClientSecret。

如果在https://github.com/googlesamples/oauth-apps-for-windows/tree/master/OAuthUniversalApp找到了适用的示例(适用于Google提供商),并且可以将其毫无问题地适应Microsoft提供商。