none
ACSV1からACSV2への移行とmanagermentkeyの扱い RRS feed

  • 質問

  • AppFablicのACSV1で作成したプログラムがあるのですがサブスクリプションを変更して新たにACSのnamespaceを作成したらACSV2になってしまい、動作しなくなってしまいました。

    1.V1であったmanagerment keyがV2ではポータルで表示されません。プログラム中にこれを指定するところがあるのですがどうしたらよいのでしょうか?

    2.V1のプログラムをV2で動くようにするにはどうしたらよいでしょうか?参考サイトなどあれば助かります。

    3.4月中旬後もACSV1でnamespaceを作成することは可能でしょうか?

    2011年4月25日 5:31

すべての返信

  • こんにちは。

     

    1.Windows Azureの管理ポータルからACSV1のNameSpaceを選択すると、右側のプロパティ一覧の一番下にManagementKeysを表示するViewボタンがありますのでそちらから確認できます。

    2.V1のときに利用していたプロトコルやトークンに合わせてV2のNamespaceを構成してあげればコード修正なくても大丈夫とは思いますが、、、未検証です。

    3.旧ポータルでもAppFabricを操作することが出来なかったので、不可と思ったほうが良いと思います。ただV1の機能はV2でも含まれていますので、設定次第だと思います。

     

    あまり明るくはないので明確な回答ではないかも知れませんが、ご参考まで。

     

    2011年4月25日 14:38
    モデレータ
  • 返信ありがとうございます。

    1.についてはV1で作成したNameSpaceについてはManagermentKeyを表示させる方法はわかるのですが、4月に作成したサブスクリプションではV2しか作成することができないため、V2でManagermentKeyを表示する方法が知りたいという質問でした。

    V2でManagermentKeyを知る方法はあるでしょうか?それともV2ではManagermentKeyというものはなくなってしまったのでしょうか?

     

     

    2011年4月27日 0:57
  • こんにちは。

     

    すみません、勘違いしていました。
    以下の手順で見ることができるManagementKey であってると思うのですが如何でしょうか。

    1:Azure管理ポータル(https://windows.azure.com/ )でV2のNamespaceを選択後リボンメニューの「Manage」-「Access Control Service」を選択して表示されるACS専用のポータルサイトを開きます。

    2:左のメニューから「Management Service」を選択

    3:Management Service AccountsからDefaultの「ManagementClient」を選択

    4:Credentialsから「Symmetric Key」を選択

    5:詳細画面でKeyが表示される(再生成等も可能)

     

    2011年4月27日 1:11
    モデレータ
  • 返信ありがとうございます。

    私も最初、指摘されたものかと思ったのですが、単純にそれをManagermentKeyとして使っただけでは動作しませんでした。

    失礼してソースを張らせてもらいましたが、

    最後のメソッドgetTokenRequestの中で指定しているManagermentkeyが件のものです。

    やはりプログラムの変更が必要なのでしょうか...

       public class AcsHttpRequest

        {

            public HttpWebResponse acsHttpRequest(string resourceType, byte[] resourceContent, string method)

            {

                HttpWebResponse httpResponse = null;

     

                try

                {

                    HttpWebRequest httpWebRquest = (HttpWebRequest)WebRequest.Create(AcsConstants.MgmtBaseUri + resourceType);

                    httpWebRquest.Method = method;

     

     

                    string authHeader = getAuthHeader(AcsConstants.MgmtBaseUri + resourceType);

                    httpWebRquest.Headers.Add(HttpRequestHeader.Authorization, authHeader);

                    httpWebRquest.ContentLength = 0;

                    if (resourceContent != null)

                    {

                        httpWebRquest.ContentLength = resourceContent.Length;

                        httpWebRquest.ContentType = AcsConstants.AcsContentType;

                        using (Stream requestStream = httpWebRquest.GetRequestStream())

                        {

                            requestStream.Write(resourceContent, 0, resourceContent.Length);

                        }

                    }

                    httpResponse = (HttpWebResponse)httpWebRquest.GetResponse();

                    int status = (int)httpResponse.StatusCode;

                }

                catch (Exception exception)

                {

                    throw exception;

                }

                 return httpResponse;

            }

     

            private string getAuthHeader(string wrapScope)

            {

                string authHeader = "";

                WebResponse httpResponse = null;

                HttpWebRequest httpWebRquest = (HttpWebRequest)WebRequest.Create(AcsConstants.MgmtStsUri);

                httpWebRquest.ContentType = AcsConstants.AuthContentType;

                httpWebRquest.Method = RESTMethod.POST.ToString();

     

     

                byte[] tokenRequest = getTokenRequest(wrapScope);

                try

                {

                    using (Stream requestStream = httpWebRquest.GetRequestStream())

                    {

                        requestStream.Write(tokenRequest, 0, tokenRequest.Length);

                    }

                }

                catch (Exception exception)

                {

                    throw exception;

                }

                string wrapToken = null;

     

                try

                {

                    httpResponse = httpWebRquest.GetResponse();

                    using (Stream responseStream = httpResponse.GetResponseStream())

                    {

                        using (StreamReader streamReader = new StreamReader(responseStream))

                        {

                            wrapToken = streamReader.ReadToEnd();

                        }

                    }

                }

                catch (Exception exception)

                {

                    throw exception;

                }

     

     

                string[] wrapParams = wrapToken.Split('&');

                string swtToken = null;

     

                foreach (string nameValue in wrapParams)

                {

                    string[] keyValueArray = nameValue.Split('=');

     

                    if (keyValueArray.Length == 2)

                    {

                        string name = keyValueArray[0];

     

                        if (name == "wrap_access_token")

                        {

                            swtToken = HttpUtility.UrlDecode(keyValueArray[1]);

                            break;

                        }

                    }

                    else

                    {

                        //throw new ArgumentException(Constants.ErrorConnection0);

                    }

                }

                authHeader = String.Format(CultureInfo.InvariantCulture, "{0} access_token=\"{1}\"", "WRAP", swtToken);   

                return authHeader;

            }

            private byte[] getTokenRequest(string wrapScope)

            {

                string tokenRequest = string.Format(CultureInfo.InvariantCulture,

                    "wrap_name={0}&wrap_password={1}&wrap_scope={2}",

                    HttpUtility.UrlEncode(AcsConstants.WrapName),

                    HttpUtility.UrlEncode(AcsConstants.ManagementKey),

                    HttpUtility.UrlEncode(wrapScope));

                return Encoding.UTF8.GetBytes(tokenRequest);

            }

        }

    2011年4月27日 3:21
  • こんにちは。

    サービスマネージメントではなく実際に認証を行う部分で指定するキーは、ACSv1の時と同じように個別に生成したものになると思います。

    ACSv1であればACMでいうところのTokenPolicyを作成する必要があると思いますが、ACSv2の場合はService Identityで作れると思います。

    ここで作成する際に生成したキーを渡すことでACSv1と同じようになると思いますが如何でしょうか。

    2011年4月27日 6:12
    モデレータ
  • 1点だけ。

    > 3.4月中旬後もACSV1でnamespaceを作成することは可能でしょうか?

    とのことですが、以下をURL参照すると
    Differences between Access Control Service 1.0 and Access Control Service 2.0
    http://msdn.microsoft.com/en-us/library/gg185940.aspx
    には、こう書いてあるので、カスタマサポートに連絡すれば作ることは可能っぽいです。
    If an older ACS namespace needs to be created or modified, contact customer support.

    2011年4月27日 12:17
  • そこは気づいていませんでした。カスタマーサポートに連絡を取ってみます。

    進展があれば報告します。

    コメントありがとうございました。

    2011年4月28日 4:06
  • Service Identityを作成して名前とkeyを渡すようにしてみましたがだめでした。元のプログラムがそもそも”owner”という名前とmanagermentkeyを渡すようになっているので、そこをService Identityの名前とキーに変えてみたのですが...

    TokenPolicyについてはよくわかっていませんので(他の人が作成したプログラムのため)、知識レベルが追いついていません。

    もう少し調べてみます。

    ありがとうございました。

    2011年4月28日 4:10
  • カスタマーサポートから連絡がありましたので簡単に要点を報告しておきます。

     

    ・ACSV1のプログラムはACSV2では動作しない。設定とかのレベルではなく基本的にはV2用に作り直す必要がある。

    ・カスタマーサポートに連絡すればV1のnamespaceを無償で作成してもらえる。

    ・ポータルからV1のnamespaceを作成する手段は現状ではないが、今後対応する予定。

    ・V1は今後も使い続けることは問題なし。

    ・現状、V1のプログラムをV2に作り変えるガイドラインなどの資料はない。

     

    対応は早かったです。V1のnamespaceを作ってもらうことにします。

    2011年4月28日 6:38