2016-08-10 25 views
0

私はXamarin.FormsプロジェクトとTable APIプロジェクトを作成しました。どちらも、Azure Portalのクイックスタートメニューから作成されています。Azure ADサーバー認証、ディレクトリを表示する権限がありません

私はポータルにAzure ADを設定しました。私はXFormsアプリケーションを通じてADからトークンを正常に取得できます。しかし、MobileServiceClientのLoginAsyncメソッドを使用してTable APIにログインしようとすると、「あなたはディレクトリまたはページを表示する権限がありません」というメッセージが表示されます。

私は以下のガイドを見てきましたが、運がありません。

How to configure your App Service application to use Azure Active Directory login

Add authentication to your Xamarin.Forms app

How to: Work with authentication

私はまた、次の質問を見てきたが、解決策を見つけることができませんでした。

Cordova AAD server flow authentication hangs on Android and iOS

私はテーブルAPIプロジェクトに関するいくつかの特定の認証を逃すかもしれないと考えていますか? Constants.ClientIDは、ネイティブクライアントアプリのClientIdをしていないWebサーバである

PCLプロジェクトXFORMS、IN

var ar = await authContext.AcquireTokenAsync(Constants.GraphResourceUri, Constants.ClientId, userCredintials); 

      JObject payload = new JObject(); 
      payload["access_token"] = ar.AccessToken; 

      var client = new MobileServiceClient(Constants.ApplicationUrl); 
      var user = await client.LoginAsync(MobileServiceAuthenticationProvider.WindowsAzureActiveDirectory, payload); 

は、ここに私のコードとのセットアップです。私はそれを周りに切り替えた場合、私はTABLE APIプロジェクト

[Authorize] 
public class StatisticController : ApiController 

TABLEのAPIのStartUp.csのCONFIGURATION

public void Configuration(IAppBuilder app) 
    { 
     app.UseAppServiceAuthentication(new AppServiceAuthenticationOptions()); 
     ConfigureMobileApp(app); 
    } 

モバイルサービスAUTHのSETUPからコントローラの404

例を取得します enter image description here

SINGLE SING-ONのADは、私は次のセットアップとポストマンによるエラーを再現することができます enter image description here

ネイティブクライアントAPPのSETTINGS enter image description here enter image description here

EDIT

をセッティング: enter image description here

「X-ZUMO-AUTH」ヘッダーにaccess_tokenの値を含めることを試みましたが、同じ結果が得られました。まだ許可はありません。私はまた、POST要求内のすべてのヘッダーを変更しないで除外しようとしました。これは、モバイルアプリまたはPostmandからのPOSTリクエストが許可されていないことを意味しますか?

ブラウザで手動でmysite.azurewebsites.net/.auth/login/aadを参照すると、ADからのユーザーでログインできます。だから、ADはサービスと正しくやり取りしているようです。

mattchendersonにIT

大感謝をFIXED!彼は、GraphResourceUriを通常のグラフapiではなく私のサービスのクライアントIDに変更するべきだと提案しています。クライアントのインスタンスを1つ追加するだけで、私は自分のサービスに正常にログインできます。

+0

新しい回答が追加されました。しかし、同じ結果です。 –

+0

受取人はいませんか?誰も同じような問題がありますか? –

答えて

1

POSTリクエストが許可されています。私はテストのために常にPostmanを使用します。

このような問題の最も一般的な原因は、視聴者確認の問題です。オーディエンスはAADトークンのプロパティで、このトークンが有効なリソースは何かを示します。上記のコードを考えれば、私は聴衆がConstants.GraphResourceUriと等しいと期待します。私の推測は、これは実際にグラフAPIであり、あなたのアプリケーションではないということです。それはLoginAsync()を呼び出すと起こると予想されますが、検証の失敗を引き起こします。代わりにWebアプリケーションクライアントIDを試してみることをお勧めします(これは、「モバイルサービス設定」のスクリーンショットからのクライアントIDです)。

時間を簡単にデバッグするために、AADトークンをhttp://jwt.ioのようなものにすることができます。トークンプロパティの表示に役立ちます。 「aud」は、ポータルに登録されているアプリケーションのクライアントIDと同じであると予想され、発行者フィールドも一致させる必要があります。トークンも期限切れでないことを確認してください。

保護されたAPIにアクセスするためにトークンを使用する場合は、それを提供するために、2つの方法があります。

  1. は、トークンを使用してリクエストのX-ZUMO-AUTHヘッダにLoginAsync()の一部として返さ。これは、同じMobileServiceClientを使用するテーブル操作のためにSDKによって自動的に行われます。
  2. ベアラトークン仕様に従って直接AADトークンを使用してください。つまり、トークンを値に置き換えて、値 "Bearer"を持つAuthorizationヘッダーに含めます。

また、コードではログイン操作用に新しいMobileServiceClientを作成しています。ログイン情報がMobileServiceClientオブジェクトに添付されているので、これは一般的には推奨しません。参照を失うと、ログイン情報(および他のいくつかの設定)が失われ、テーブル操作には適用されません。共有コード内の静的変数であるXamarinなど、別の場所で参照される単一のインスタンスを使用することをお勧めします。

+0

@mattchendersonありがとう!私のサービスのクライアントIDにグラフAPIを変更すると、あなたが示唆したように、このトリックが実行されました!私はこれをあきらめようとしていました...私は他人が恩恵を受けるための修正を含めるために答えを編集しました。 –

関連する問題