WebAuthenticationBroker收到OAuth2回调时抛出异常

时间:2013-02-07 03:23:03

标签: windows-8 windows-runtime oauth-2.0 imgur

WebAuthenticationBroker似乎无法处理我ms-app://的导航。只是抛出这个丑陋的错误,如下所示。

步骤

  1. 调用AuthenticateAsync(),包括在运行时获得的回调uri:WebAuthenticationBroker.GetCurrentApplicationCallbackUri()
  2. 完成授权流程,点击允许
  3. 经纪人显示页面无法连接到服务,而不是返回。我们现在无法连接到您需要的服务。无法执行任何操作,因此我点击后退按钮可见。
  4. 调试器在catch:"The specified protocol is unknown. (Exception from HRESULT: 0x800C000D)"
  5. 上中断

    收到WebAuthenticationBroker.AuthenticateAsync()的回调(根据Fiddler4&事件查看器),但它会抛出上述异常,就像它不知道如何解释ms-app://协议一样。

    所有示例都暗示我的代码应该有效,但我认为不太明显会导致问题。

    代码

    private static string authorizeString =
      "https://api.imgur.com/oauth2/authorize?client_id=---------&response_type=token";
    
    private Uri startUri = new Uri(authorizeString);
    
    public async void RequestToken() {
      try {
        var war = await WebAuthenticationBroker.AuthenticateAsync(
          WebAuthenticationOptions.UseTitle
          , startUri);
          // Imgur knows my redirect URI, so I am not passing it through here
    
        if (war.ResponseStatus == WebAuthenticationStatus.Success) {
          var token = war.ResponseData;
        } 
      } catch (Exception e) { throw e; }
    }
    

    事件查看器日志摘录(按时间顺序排列)

    有关我如何获得此信息的信息,请阅读以下MSDN:Web authentication problems (Windows)。不幸的是,这是查询 authhost.exe导航错误时唯一的搜索结果。

    1. 信息AuthHost redirected to URL: <ms-app://s-1-15-2-504558873-2277781482-774653033-676865894-877042302-1411577334-1137525427/#access_token=------&expires_in=3600&token_type=bearer&refresh_token=------&account_username=------> from URL: <https://api.imgur.com/oauth2/authorize?client_id=------&response_type=token> with HttpStatusCode: 302.
    2. 错误AuthHost encountered a navigation error at URL: <https://api.imgur.com/oauth2/authorize?client_id=------&response_type=token> with StatusCode: 0x800C000D.
    3. 信息AuthHost encountered Meta Tag: mswebdialog-title with content: <Can't connect to the service>.
    4. 感谢阅读,Stack。不要让我失望!

2 个答案:

答案 0 :(得分:4)

Afaik,即使您假设远程服务知道它,您也需要将结束URL传递给AuthenticateAsync。

WebAuthenticationBroker的工作方式如下:指定“端点”URL,当遇到以此URL开头的链接时,它会认为身份验证过程已完成,甚至不再尝试导航到此URL。 因此,如果您将“foo:// bar”指定为回调URI,则导航到“foo:// bar”将完成身份验证,“foo:// barbaz”也将完成身份验证,但不会“foo:// baz”。< / p>

答案 1 :(得分:3)

解决! @ma_il帮助我理解了代理如何实际评估重定向回调,它让我回到原点,我意识到我认为WebAuthenticationOptions.UseTitle是正确的用法。 不是这样。使用令牌反对Imgur的API,它需要WebAuthenticationOptions.None并且它立即起作用。

作为未来求职者的一个例子,这是我的代码。

    private const string clientId = "---------";
private static Uri endUri = WebAuthenticationBroker.GetCurrentApplicationCallbackUri();
private static string authorizeString = "https://api.imgur.com/oauth2/authorize?" 
                                          + "client_id=" 
                                          + clientId 
                                          + "&response_type=token" 
                                          + "&state=somestateyouwant" 
                                          + "&redirect_uri=" 
                                          + endUri;
private Uri startUri = new Uri(authorizeString);   


public async void RequestToken() {
  try {
    WebAuthenticationResult webAuthenticationResult =
      await WebAuthenticationBroker.AuthenticateAsync(WebAuthenticationOptions.None
                                                      , startUri
                                                      , endUri);

    if (webAuthenticationResult.ResponseStatus == WebAuthenticationStatus.Success) {
      string token = webAuthenticationResult.ResponseData;
      // now you have the token
    }
  } catch { throw; }
}