4

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

脚步

  1. call AuthenticateAsync(),包括运行时获取的回调 uri:WebAuthenticationBroker.GetCurrentApplicationCallbackUri()
  2. 完成授权过程,点击Allow
  3. 代理没有返回,而是显示页面无法连接到服务。我们现在无法连接到您需要的服务。 什么都做不了,所以我点击了可见的后退按钮。
  4. 调试器在捕获时中断:"The specified protocol is unknown. (Exception from HRESULT: 0x800C000D)"

收到回调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 身份验证问题 (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

2 回答 2

4

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

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

于 2013-02-07T10:44:52.883 回答
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; }
}
于 2013-02-08T13:43:50.023 回答