Oauth2在ASP.NET MVC 5 web应用程序中适用于谷歌,但不适用于微软



我每隔几个月就会重新讨论这个问题,但似乎没有找到任何位置。身份验证设置以模板Identity server asp.net mvc、sqldb开始,所有这些都很好。使用本教程将Google设置为外部验证器。尝试为微软遵循类似的过程,尽管似乎没有针对微软作为MVC5的外部提供商的教程,只有asp.net核心2。因此,为这两个提供程序设置客户端id和机密,并在开发网站上注册。在应用程序注册门户,我将重定向为https://myapp.azurewebsites.net/signin-microsoft.在RouteConfig中,我添加了以下路由:

routes.MapRoute(
name: "signin-google", 
url: "signin-google", 
defaults: new { controller = "Account", action = "ExternalLoginCallback" });
routes.MapRoute(
name: "signin-microsoft",
url: "signin-microsoft",
defaults: new { controller = "Account", action = "ExternalLoginCallback" });

我不记得在教程中看到过,坦率地说,在这一点上,我不记得谷歌为什么会出现。但在我的项目中,我看到了谷歌的路线,所以我为微软添加了一个,希望它能解决问题。

错误

当我点击链接用MS id登录时,我会得到一个页面,上面写着

我们无法完成您的请求Microsoft帐户遇到技术问题。请稍后再试。更能说明问题的是返回网址:

https://login.live.com/err.srf?lc=1033#error=invalid_request&error_description=The+provided+value+for+the+input+parameter+'redirect_uri'+is+not+valid.+The+expected+value+is+'https://login.live.com/oauth20_desktop.srf'+or+a+URL+which+matches+the+redirect+URI+registered+for+this+client+application.&state=VMXVAOBL8eJs8OVRabazU4mJbDZFtJR55mx5BVtLUX-mptCDJYMOqep0Ud4CyX2eJwkJY4SutIcCrxJBILueR-h5vUOSdn1lt-qCDJ5xI3fNuLuJTyE84uUtPTzC1hXHLAURtX7gLcGs-OIF9dYz8eN0nvgTQiVSB9GrPnj5o4KTS6pAwsad8qw5UWpFnrlSXd3eJo83CzrWqeh9YSsxkEVaKN5LKB_rzeM4gQdiD5Q

我会拿出重要的部分:

+提供的+值+for+The+input+parameter+'redirect_uri'+是+无效的++预期的+值+为+'https://login.live.com/oauth20_desktop.srf'+或+a+URL+which+matches+the+redirect+URI+registered+for+this+客户端+应用程序&状态

Core2教程中提到了这一点,但没有提到如何在应用程序中修复它。如果我的应用程序本身有什么地方我应该设置它,我就想不出来了。我已经从登录页面通过控制器跟踪了代码中的步骤,但我看不到重定向URL在应用程序中的设置位置。读到这个线程,我意识到我应该使用fiddler来检查头部,它最终发送的重定向是

http%3A%2F%2Fmyapp.azurewebsites.net%2Signin microsoft

。。。不是安全版本。所以,如果这是我的问题的根源,我该如何设置我在azure中托管的生产服务器,以便通过https发出请求?请注意,MS dev不允许您在url中使用http进行重定向。

除非其他人能以不同的方式告诉我,否则我想我回答了自己的问题。由于我使用的是免费的Azure计划atm,因此不支持SSL(Basic或更高版本),而且它永远不会使用https进行调用。这很有道理。同时,MS开发门户只接受带有https的URL。我在这里还发现了在我的网络应用程序上强制使用https。基本上在web.config中添加一个规则,看起来像:

<rule name="Force HTTPS" enabled="true">
<match url="(.*)" ignoreCase="false" />
<conditions>
<add input="{HTTPS}" pattern="off" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}" appendQueryString="true" redirectType="Permanent" />
</rule>

最新更新