C# Windows Phone中的OAuth2 WebAuthenticationBroker不回调到ContinuationManager

C# Windows Phone中的OAuth2 WebAuthenticationBroker不回调到ContinuationManager,c#,oauth-2.0,windows-phone-8.1,continuations,C#,Oauth 2.0,Windows Phone 8.1,Continuations,我正在我的Windows Phone 8.1应用程序中执行OAuth2身份验证,我正在使用WebAuthenticationBroker和WP的AuthenticateAndContinue()方法。 我正在向我的服务器进行身份验证,在那里我发送了两个参数,它返回我的访问令牌,而无需任何其他步骤。鉴于这种情况,我没有callbakUri,因此我使用WebAuthenticationBroker.GetCurrentApplicationCallbackUri() 我的代码如下所示: Uri en

我正在我的Windows Phone 8.1应用程序中执行OAuth2身份验证,我正在使用
WebAuthenticationBroker
和WP的
AuthenticateAndContinue()
方法。
我正在向我的服务器进行身份验证,在那里我发送了两个参数,它返回我的访问令牌,而无需任何其他步骤。鉴于这种情况,我没有callbakUri,因此我使用
WebAuthenticationBroker.GetCurrentApplicationCallbackUri()

我的代码如下所示:

Uri endpointURL = new Uri(_requestUrl + "&client_id=" + clientId + "&client_secret=" + clientSecret);
Uri callbackUri = WebAuthenticationBroker.GetCurrentApplicationCallbackUri();
WebAuthenticationBroker.AuthenticateAndContinue(endpointURL, callbackUri, null, WebAuthenticationOptions.None);
我的项目中有
ContinuationManager.cs
类,以及
App.xaml.cs
中所需的所有更改,如下所述:

我的问题是,在执行上述代码后,
ContinuationManager
类中的
Continue()
方法永远不会执行,因此我的应用程序会在那里阻塞。


我在这里遗漏了什么吗?

WebAuthenticationBroker.AuthenticateAndContinue
知道当用户重定向到特定页面时,身份验证已完成

有两种方法可以解决这个问题:

  • 大多数服务都接受一个参数来设置用户重定向到的URI(该参数通常被称为
    回调
    。在这种情况下,您可以使用
    WebAuthenticationBroker.GetCurrentApplicationCallbackUri
    生成URI,并将其传递给
    WebAuthenticationBroker.AuthenticateAndContinue
    方法(正如您在代码示例中所做的那样)

  • 如果服务不接受回调参数,那么您需要以另一种方式执行操作:首先检查服务重定向的URI(手动调用一次),然后将此URI传递给
    WebAuthenticationBroker.AuthenticateAndContinue
    方法。例如,假设OAuth服务重定向到,那么您需要调用:

    WebAuthenticationBroker.AuthenticateAndContinue(endpointURL, new Uri("http://www.stackoverflow.com"), null, WebAuthenticationOptions.None);
    

  • 看起来您正在使用。这是一个非交互式流,您不需要WebAuthenticationBroker来使用它。如果您正在使用此流,只需使用HttpClient来获取令牌即可

    也就是说,这个流可能不是您所需要的。首先,我假设您确实想要验证实际用户,即资源所有者。其次,您使用的流要求您的手机应用程序中存在客户端机密。这是一个很大的禁忌!这个流是为服务器端进程设计的


    我认为您需要查看相应的服务。

    我不知道您正在调用什么服务,但它可能希望在其中一个参数中包含回调URI(以及客户端id和客户端机密)。否则,它无法猜测在身份验证后需要将用户重定向到何处。事实上,它没有。我可以通过HTTP POST发出请求,但最好使用新类。
    \u requestUrl
    的值是什么?请解释“使用新类会很好”.你有一把新螺丝刀,你想用它把钉子钉在墙上?如果你可以通过POST请求提出请求,那你为什么不呢?看看我的答案。我确实在使用客户端凭据授权,Http方法现在似乎是正确的。不过,我认为关于这个主题的问答对可能想要的人是有效的和有帮助的回拨到他们自己的服务。不过,我感谢您提供的额外和有用的答案。@ricochete我仍然不理解您为什么使用客户端凭据进行身份验证。如果您将客户端id和客户端机密嵌入到手机应用程序中,基本上每个人都可以使用。您也可以不进行身份验证。您能解释一下吗?身份验证这项工作将在类库中完成,客户端数据将由主应用程序传递。它被要求这样工作,我对此没有任何意见。