Oauth2适用于谷歌但不适用于ASP.NET MVC 5网络应用程序中的微软

时间:2017-10-26 06:03:04

标签: asp.net-mvc azure oauth-2.0

我几个月来重新审视这个问题,但似乎没有在哪里。身份验证设置以模板身份服务器asp.net mvc,sql db开始,一切正常。使用此tutorial将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添加了一个希望它可以解决问题。

错误

当我点击链接以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

我将提出重要的部分:

  

在+提供+值+为+ +输入+参数+ 'REDIRECT_URI' 是+未+有效。+的+预期+值+是+ 'https://login.live.com/oauth20_desktop.srf' +或+ A + URL +其中+匹配+的+重定向+ URI +注册+为+ +这个客户+应用&安培;状态

这在Core2教程中提到,但不是如何在应用程序中修复它。如果我的应用程序本身存在某个地方我应该设置它,我无法理解它。我已经从登录页面,通过控制器跟踪代码中的步骤,我无法看到在应用程序中设置redirecturl的位置。读这个thread我意识到我应该使用fiddler检查标题,它最终会发送重定向

  

的http%3A%2F%2Fmyapp.azurewebsites.net%2Fsignin微软

...不是安全版本。因此,如果这是我的困境的源头,我如何设置我在azure托管的生产服务器通过https发出请求?请注意,MS dev不允许您在网址中使用http进行重定向。

1 个答案:

答案 0 :(得分:0)

除非其他人能以不同的方式告诉我,否则我想我回答了自己的问题。由于我使用的是免费的Azure计划atm,因此不支持SSL(基本或更高版本),并且它永远不会使用https进行调用。这是有道理的。同时,MS dev门户只接受https的网址。我还发现了here关于在我的网络应用上强制执行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>