6

Azure AD 認証で保護されている Azure のプライベート API アプリにアクセスする必要がある MVC アプリケーションがあります。そのため、Azure AD ベアラー トークンを取得し、それをZumo-Authトークンに転送し、それを使用して API アプリにアクセスする必要があります。

私はこのチュートリアルを進めており、からトークンを要求する必要がある時点まで、すべてが正常に機能していますauthContext。コードのスニペットは次のとおりです。

var authContext = new AuthenticationContext(
    "https://login.microsoftonline.com/MyADDomain.onmicrosoft.com");

ClientCredential credential = new ClientCredential(
    "04472E33-2638-FAKE-GUID-F826AF4928DB", 
    "OMYAPIKEY1x3BLAHEMMEHEHEHEHEeYSOMETHINGRc=");

// Get the AAD token.
var appIdUri = 
    "https://MyAppGateway-814485545465FAKE4d5a4532cd.azurewebsites.net/login/aad";

//var appIdUri = "https://MyADDomain.onmicrosoft.com/MyAppName";
//var appIdUri = "https://MyADDomain.onmicrosoft.com/";
//var appIdUri = "https://graph.windows.net";

AuthenticationResult result = 
    authContext.AcquireToken(appIdUri, credential); // <-- can't get the token from AD

// downhill from here
var aadToken = new JObject();
aadToken["access_token"] = result.AccessToken;
var appServiceClient = new AppServiceClient(
    "https://MyAppGateway-814485545465FAKE4d5a4532cd.azurewebsites.net/");

// Send the AAD token to the gateway and get a Zumo token
var appServiceUser = await appServiceClient.LoginAsync("aad", aadToken);

の行がauthContext.AcquireToken(appIdUri, credential)問題の原因です。

appIdUri私が与えるようhttps://MyAppGateway-814485545465FAKE4d5a4532cd.azurewebsites.net/login/aadに、例外が発生した場合:

400: AdalServiceException: AADSTS50001: リソース ' https://MyAppGateway-814485545465FAKE4d5a4532cd.azurewebsites.net/login/aad ' がアカウントに登録されていません。

しかし、この正確な行はReply UrlADアプリケーションのリストにあります

Azure AD アプリケーションの応答 URI

使用しようとしたとき、https://MyADDomain.onmicrosoft.com/MyAppNameまたは別の例外メッセージが表示https://MyADDomain.onmicrosoft.com/されたとき:appIdUri

400: AdalServiceException: AADSTS50105: アプリケーション '04472E33-2638-FAKE-GUID-F826AF4928DB' は、アプリケーション ' https://MyADDomain.onmicrosoft.com/MyAppName 'のロールに割り当てられていません

または

400: AdalServiceException: AADSTS50105: アプリケーション '04472E33-2638-FAKE-GUID-F826AF4928DB' は、アプリケーション ' https://MyADDomain.onmicrosoft.com/ 'のロールに割り当てられていません

どちらの場合もApp ID URI、AD アプリケーションで ' https://MyADDomain.onmicrosoft.com/MyAppName ' または ' https://MyADDomain.onmicrosoft.com/ ' に設定しました。のリストにある両方の名前ですReply URL

最終的に、十分な試行を重ねた後、https://graph.windows.netasappIdUriを入れて、ベアラー トークンを取り戻しました。しかし、トークンは過去の有効期限 (過去約 1 分) で与えられました。そのため、これ以上何もできませんでした。401-Unauthenticatedトークンを使用して API アプリにログインしようとしたときに取得しました。

私は何が欠けていますか?

4

1 に答える 1

8

私は先に進み、あなたが参照したチュートリアルに従いました: Azure Active Directory によって認証された Web アプリ クライアントから Azure API アプリを呼び出す

  1. 連絡先データを返す Azure API Api を作成する
  2. API アプリを Azure App Service にデプロイします。
  3. Azure Active Directory を使用して API アプリを保護します。

その後、トークンを取得できました。次のデモからわかるように、私のコードはあなたのコードと何ら変わりはありませんがusing Microsoft.IdentityModel.Clients.ActiveDirectoryAsync.

AAD からアクセス トークンを取得する

class Program
{
    static void Main(string[] args)
    {
        var authContext = new AuthenticationContext(Constants.AUTHORITY);
        var credential = 
            new ClientCredential(Constants.CLIENT_ID, Constants.CLIENT_SECRET);
        var result = (AuthenticationResult)authContext
            .AcquireTokenAsync(Constants.API_ID_URL, credential)
            .Result;
        var token = result.AccessToken;
        Console.WriteLine(token.ToString());
        Console.ReadLine();
    }
}

定数

AUTHORITY. この最初のセグメントはhttps://login.microsoftonline.comです。最後のセグメントは許可されたテナントです。portal.azure.com で許可されたテナントを設定し、アプリケーションのゲートウェイに移動して、[設定] > [ID] > [Azure Active Directory] ​​> [許可されたテナント] を選択します。私のテナントは bigfontoutlook.onmicrosoft.com です。

CLIENT_ID. Azure Active Directory に追加したアプリケーションからこのクライアント ID を取得します。これは、manage.windowsazure.com > Active Directory > Your Directory > APPLICATIONS > Your Application > CONFIGURE で見つけてください。取得したら、ゲートウェイの Azure Active Directory 設定の [クライアント ID] フィールドに追加する必要があります。

CLIENT_SECRET. これは、クライアント ID を取得するのと同じ場所で作成/取得します。

API_ID_URL. [設定] > [ID] > [Azure Active Directory] ​​> [アプリ URL] を選択して、Web API アプリのゲートウェイ ブレード内でこれを取得します。

これが私のために働くものです。

class Constants
{
    public const string AUTHORITY =
     "https://login.microsoftonline.com/bigfontoutlook.onmicrosoft.com/";

    public const string CLIENT_ID = 
      "0d7dce06-c3e3-441f-89a7-f828e210ff6d";

    public const string CLIENT_SECRET =
      "AtRMr+Rijrgod4b9Q34i/UILldyJ2VO6n2jswkcVNDs=";

    public const string API_ID_URL = 
      "https://mvp201514929cfaaf694.azurewebsites.net/login/aad";
}

最終的にデコードされた JWT

これは、デコードされた JWT アクセス トークンに含まれるものです。

{
 typ: "JWT",
 alg: "RS256",
 x5t: "MnC_VZcATfM5pOYiJHMba9goEKY",
 kid: "MnC_VZcATfM5pOYiJHMba9goEKY"
}.
{
 aud: "https://mvp201514929cfc350148cfa5c9b24a7daaf694.azurewebsites.net/login/aad",
 iss: "https://sts.windows.net/0252f597-5d7e-4722-bafa-0b26f37dc14f/",
 iat: 1442346927,
 nbf: 1442346927,
 exp: 1442350827,
 ver: "1.0",
 tid: "0252f597-5d7e-4722-bafa-0b26f37dc14f",
 oid: "5a6f33eb-b622-4996-8a6a-600dce355389",
 sub: "5a6f33eb-b622-4996-8a6a-600dce355389",
 idp: "https://sts.windows.net/0252f597-5d7e-4722-bafa-0b26f37dc14f/",
 appid: "0d7dce06-c3e3-441f-89a7-f828e210ff6d",
 appidacr: "1"
}.

注: これは、使い捨てのリソース グループを持つ使い捨ての Active Directory アカウント内の使い捨てのアプリであるため、セキュリティ資格情報を表示することは問題ではありません。

念のための図:)

Azure ADD で点と点をつなぐ

于 2015-09-15T19:40:58.483 に答える