【问题标题】:Can't Authenticate with Local .NET back-end无法使用本地 .NET 后端进行身份验证
【发布时间】:2014-03-26 06:43:28
【问题描述】:

我已按照指南进行操作:

Getting Started with Authentication with Mobile Services .NET for Windows Store

只要我不需要对用户进行身份验证,我就可以在本地运行该服务。如果我将服务发布到 Azure,我还可以对用户进行身份验证。但我希望能够在本地测试 对用户进行身份验证。如何做到这一点?

我正在使用 Live ID,并且在 Web.config 中设置了正确的 ClientID 和 ClientSecret。当我尝试从客户端调用 LoginAsync 时,调用失败,请求无法完成。 (方法不允许)

** 2014-03-20 更新 **

根据 Carlos 和 Henrik 的 cmets,我更新了我的本地服务,使其看起来 完全 像我的服务器实例。我关注了 Scot Hanselmans excellent guide,现在我的服务在端口 80 端口 443 上本地运行,并具有完全有效的 SSL 证书。它甚至在完全相同的 https://xxxx.azure-mabile.net 主机名上运行。

通过这些更改,现在在我的本地计算机上运行应用程序或在 Azure 上运行应用程序之间没有任何配置差异。我可以在浏览器中转到 https://xxxx.azure-mabile.net,重定向到 Live login,登录,然后成功重定向回服务。在浏览器中一切正常。但是它仍然在应用程序中不起作用。

我附加了调试器,将 CLR 错误设置为“抛出时中断”,并设法在服务中捕获异常。这是我在即时窗口中看到的内容:

Response 属性没有帮助。它没有提供有关该问题的任何其他信息。

唯一让我印象深刻的是,该应用正在尝试向 /login/microsoftaccount 执行 POST,而浏览器通常会执行 >GET 在这个地址(然后被重定向)。

** 更新 #2 2014-03-20 **

按照remote debugging 的 Henriks 指南后,我能够加载符号并获得 tiny 更多信息:

“现有连接被远程主机强行关闭”

错误代码是 10054 (WSAECONNRESET) Connection reset by peer。

看起来实时身份验证服务器可能会强制终止连接,但仅在我使用应用程序进行身份验证时。同样,浏览器中的身份验证很好。这一点,再加上 /login/microsoftaccount 是来自应用程序的 POST,这似乎表明我从 LiveClient.LoginAsync 返回的身份验证令牌存在问题。我会做更多的挖掘......

【问题讨论】:

  • 如果您在浏览器中尝试使用https:// 而不是http:// 登录,它仍然有效吗?如果我没记错的话,Windows 8 应用程序中的身份验证需要通过 HTTPS 完成。
  • 谢谢卡洛斯。这似乎没有解决它。我已经更新了上面的问题,并且我已经在端口 443 上使用有效的受信任证书在本地完全启用了 HTTPS。还是不行。
  • 我也试过这个,但没有运气。我还配置了对 issexpress link 的外部访问,在 web.config 中输入了客户端密钥和客户端密码,并将客户端和服务器 URL 添加到谷歌的开发人员仪表板中。 Fiddler 显示“invalid_client”。

标签: azure-mobile-services


【解决方案1】:

目前,它已设置为在本地运行时不需要身份验证从本地主机访问服务。在这种情况下,允许匿名访问(这在云中运行时当然会被禁用)。

我们真的没有办法让您在本地进行身份验证,因为重定向 URI 不起作用(它们不能指向 localhost,因为 Facebook 无法解析“localhost”)。

一种选择是,我们可以以某种方式在本地模拟身份验证并为您提供令牌,而无需连接各种身份提供者。我不确定那会是什么样子,但我们可以考虑一下。

亨里克

【讨论】:

  • 谢谢亨利克。我很欣赏在本地运行时不需要身份验证,但我需要能够唯一标识用户。我的服务为每个单独的用户存储了大量信息,不知道他们是谁违背了应用程序的目的。因此,它与身份验证无关,而与身份识别有关。当您有时间时,请查看我对上述问题的更新。我的本地服务现在使用有效证书在 80 和 443 上运行。它还“模拟”了我的 azure-mobile.net 网址,因此 Facebook 不必重定向到 localhost。遗憾的是它仍然无法正常工作。
  • 您是否找到过修复或解决方法?像您一样,我真的不需要“验证”任何人,就像我需要测试经过验证的用户的场景以确保他们正确连接到应用程序中的数据一样。实时应用程序上的远程调试是测试这个的唯一方法,我必须盲目地构建它吗?
【解决方案2】:

您是否在您的 Live Connect 项目中设置了Mobile client app: Yes?我认为该设置旨在与 Live Connect SDK(客户端)流一起使用,而不是与基于浏览器的(服务器)流一起使用。 .NET 后端尚不支持客户端流。

您还需要确保在客户端上使用LoginAsync(MobileServiceAuthenticationProvider.MicrosoftAccount) 来触发服务器流。

【讨论】:

  • 我很确定我尝试了两种方式的设置,但我可以再次测试。您是说将其设置为“否”会导致它使用 GET 而不是 POST 来访问 LoginController?您能否提供有关这两个登录流程之间差异的更多信息? Windows 8 应用程序如何使用基于服务器的登录流程而不是客户端登录流程?
  • 刚刚将其更改为 false 并尝试再次登录。方法不允许的相同错误。看起来它仍在尝试进行 POST。
  • 我怀疑您可能在客户端上使用了错误的登录方法,请参阅我的编辑。
  • 好的,这确实有效。但是,这种方法有两个重大问题:首先,我的服务代码(以及登录)都在共享 PCL 中处理。您要求我使用的 LoginAsync 的单参数版本位于特定于平台的程序集 Microsoft.WindowsAzure.Mobile.Ext 中。不能从 PCL 调用该方法。在 PCL 中只能调用接受 JObject 的版本。
  • 使用您建议的版本将需要对我的服务库进行重大重构,因为我的 PCL 在登录过程中负责其他操作(收集用户数据、注册推送通知等)虽然我可以看看那个重构,它仍然没有解决我用这种方法遇到的第二个重要问题:它禁用了单点登录。我看不到任何方法可以像以前那样单击“接受”按钮,并且每次连续运行该应用程序都会自动登录。
猜你喜欢
  • 2015-09-08
  • 2013-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-08
  • 2020-07-28
相关资源
最近更新 更多