4

WebAuthenticationBroker は、 my へのナビゲーションを処理できないようですms-app://。以下に示すように、この醜いエラーをスローするだけです。

手順

  1. AuthenticateAsync()実行時に取得されたコールバック uri を含むCall :WebAuthenticationBroker.GetCurrentApplicationCallbackUri()
  2. 承認プロセスを経て、Allowを押します。
  3. 戻る代わりに、ブローカーはサービスに接続できませんというページを表示します。現在必要なサービスに接続できません。 何もできないので、表示されている [戻る] ボタンを押しました。
  4. デバッガーはキャッチ時に中断します:"The specified protocol is unknown. (Exception from HRESULT: 0x800C000D)"

のコールバックは受信されますが (Fiddler4 とイベント ビューアーによると)、プロトコルWebAuthenticationBroker.AuthenticateAsync()の解釈方法がわからないかのように、前述の例外がスローされます。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

2 に答える 2

4

リモート サービスがエンド URL を認識していると仮定しても、エンド 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 に答える