すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:.NET

最終更新日:Dec 20, 2023

このトピックでは、で署名を計算する方法について説明します。サーバーでNETを使用し、アップロードコールバックを設定し、フォームアップロードを使用してデータをOSSにアップロードします。

前提条件

  • アプリケーションサーバのドメイン名は、インターネットを介してアクセス可能である。
  • アプリケーションサーバーにVisual Studio 2012以降がインストールされています。
  • アプリケーションサーバーは Net Framework 4.5以降がインストールされます。

手順1: アプリケーションサーバーの設定

  1. アプリケーションサーバーのソースコードをダウンロードします。. NET.
  2. この例では、Windowsシステムが使用されています。 ソースコードをC:\callback-server-dotnetディレクトリに解凍します。
  3. ディレクトリに移動します。 ソースコードを含むTinyHttpServer.csファイルを開きます。 次のスニペットを変更します。
    // AccessKey IDを入力します。
    パブリック静的文字列accessKeyId = "<yourAccessKeyId>";
    // AccessKeyシークレットを入力します。
    パブリック静的文字列accessKeySecret = "<yourAccessKeySecret>";
    // ホストをhttps:// bucketname.endpointの形式の値に設定します。
    public static string host = "https://bucketname.oss-cn-hangzhou.aliyuncs.com";
    // アップロードコールバック要求の送信先のサーバーのURLを設定します。 IPアドレスとポート番号を実際の情報に置き換えます。
    パブリック静的文字列callbackUrl = "http:// 192.168.0.1:8888";
    // アップロードするオブジェクトの名前のプレフィックスを指定します。
    パブリック静的文字列uploadDir = "user-dir-prefix/"; 
    • accessKeyId: AccessKey IDを入力します。
    • accessKeySecret: AccessKeyシークレットを入力します。
    • host: 形式はhttps:// bucketname.endpointです。 例: https://bucket-name.oss-cn-hangzhou.aliyuncs.com。 エンドポイントの詳細については、「Terms」トピックの「エンドポイント」セクションを参照してください。
    • callbackUrl: アップロードコールバック要求の送信先のサーバーのURLを設定します。 このURLは、アプリケーションサーバーとOSS間の通信に使用されます。 オブジェクトがアップロードされると、OSSはこのURLを使用してオブジェクトアップロード情報をアプリケーションサーバーに送信します。 この例では、URLをString callbackUrl ="http:// 10.10.10.10:1234"; に設定します。
    • uploadDir: 同じ名前の既存のオブジェクトが上書きされないように、オブジェクトのプレフィックスを指定します。 このパラメーターを指定しないままにすることもできます。
  4. Visual Studioを使用して、aliyun-oss-net-callback-server.slnファイルを開きます。 [有効化] をクリックして、実行可能ファイルaliyun-oss-net-callback-server.exeを生成します。

ステップ2: クライアントの設定

  1. クライアントソースコードをダウンロードします。
  2. パッケージをディレクトリに解凍します。 この例では、D:\aliyun\aliyun-oss-appserver-jsディレクトリが使用されています。
  3. ディレクトリに移動します。 upload.jsファイルを開きます。 次のコードを見つけます。
    // serverUrlは、署名やポリシーなどの情報を取得するために使用されるアプリケーションサーバーのURLを指定します。 IPアドレスとポート番号を実際の情報に置き換えます。
    serverUrl = 'http:// 192.168.0.1:8888 ' 
  4. severUrlをアプリケーションサーバーのURLに設定します。 この例では、serverUrl = 'http:// 10.10.10.10:1234 'を指定します。

ステップ3: CORS設定の変更

フォームアップロードを使用してクライアントからOSSにデータをアップロードする場合、クライアントはリクエストにOriginヘッダーを含め、ブラウザーを使用してリクエストをOSSに送信します。 OSSは、クロスオリジンリソース共有 (CORS) 検証用のOriginヘッダーを含むリクエストメッセージを検証します。 POSTメソッドを使用するには、バケットのCORSルールを設定します。

  1. OSSコンソールにログインします。

  2. 左側のナビゲーションウィンドウで、バケットリスト をクリックします。 [バケット] ページで、目的のバケットを見つけてクリックします。

  3. 左側のナビゲーションウィンドウで、[コンテンツセキュリティ] > [クロスオリジンリソース共有 (CORS)] を選択します。

  4. [クロスオリジンリソース共有 (CORS)] ページで、[ルールの作成] をクリックし、次の図に示すパラメーターを設定します。

    重要

    データのセキュリティを確保するために、OSSでリクエストを許可する実際のドメイン名を [ソース] フィールドで指定することを推奨します。 詳細については、「CORSの設定」をご参照ください。

ステップ4: アップロードコールバック要求を送信する

  1. アプリケーションサーバーを起動します。
    アプリケーションサーバーのコマンドラインで、aliyun-oss-net-callback-server.exe実行可能ファイルが生成されているディレクトリに移動します。 コマンドaliyun-oss-net-callback-server.exe ${ip} ${port} を実行して、アプリケーションサーバーを起動します。
    cd C:\Users\Desktop\callback-server-dotnet\aliyun-oss-net-callback-server\bin\Debug \
    aliyun-oss-net-callback-server.exe 10.10.10.10 1234 
    説明
    • 実際のディレクトリが適用されます。 Visual Studioを使用してaliyun-oss-net-callback-server.exe実行可能ファイルを生成すると、ディレクトリを表示できます。
    • ${ip} と ${port} をアプリケーションサーバーのIPアドレスとポート番号に変更します。 例: aliyun-oss-net-callback-server.exe 10.10.10.10 1234
  2. クライアントを起動します。
    1. PCで、クライアントのソースコードを含むディレクトリにあるindex.htmlファイルを開きます。
      重要 index.htmlファイルは、Internet Explorer 10以前と互換性がない場合があります。 Internet Explorer 10以前を使用するときに問題が発生した場合は、デバッグを実行する必要があります。
    2. [ファイルの選択] をクリックします。 指定したタイプのファイルを選択します。 [アップロード] をクリックします。
      オブジェクトがアップロードされると、コールバックサーバーによって返されたコンテンツが表示されます。

アプリケーションサーバのコアコード解析

アプリケーションサーバーのソースコードは、署名ベースのアップロードとアップロードコールバックを実装するために使用されます。
  • 署名ベースのアップロード中、アプリケーションサーバーはクライアントから送信されたGETメッセージに応答します。 スニペットの例:
    プライベート静的文字列GetPolicyToken()
    {
      // expireTime
      var expireDateTime = DateTime.Now.AddSeconds(expireTime);
    
      // ポリシーの例
      //{
      // "expiration": "2020-05-01T12:00:00.000Z" 、
      // "conditions": [
      // ["content-length-range", 0, 1048576000]
      // ["starts-with", "$key", "user-dir-prefix/"]
      //  ]
      //}
    
      // ポリシー
      var config = new PolicyConfig();
      config.expiration = FormatIso8601Date(expireDateTime);
      config.conditions = new List<List<Object>>();
      config.conditions.Add(new List<Object>());
      config.conditions[0].Add("content-length-range");
      config.conditions[0].Add (0);
      config.conditions[0]. 追加 (1048576000);
      config.conditions.Add(new List<Object>());
      config.conditions[1].Add("starts-with");
      config.conditions[1].Add("$key");
      config.conditions[1].Add(uploadDir);
    
      var policy = JsonConvert.SerializeObject(config);
      var policy_base64 = EncodeBase64("utf-8" 、ポリシー);
      var signature = ComputeSignature(accessKeySecret, policy_base64);
    
      // コールバック
      var callback = new CallbackParam();
      callback.ca llbackUrl = callbackUrl;
      callback.ca llbackBody = "filename =${ object}&size =${ size}&mimeType =${ mimeType}&height =${ imageInfo.height}&width =${ imageInfo.width}";
      callback.ca llbackBodyType = "application/x-www-form-urlencoded";
    
      var callback_string = JsonConvert.SerializeObject (コールバック);
      var callback_string_base64 = EncodeBase64("utf-8" 、callback_string);
    
      var policyToken = new PolicyToken();
    
      policyToken.accessid = accessKeyId;
      policyToken.host=ホスト;
      policyToken.policy = policy_base64;
      policyToken.signature=署名;
      policyToken.expire = ToUnixTime(expireDateTime);
      policyToken.ca llback = callback_string_base64;
      policyToken.dir = uploadDir;
    
      を返すJsonConvert.SerializeObject(policyToken);
    }
    
    public void DoGet()
    {
      Console.WriteLine("DoGet request: {0}" 、this.httpURL);
      var content = GetPolicyToken();
      this.swResponse.WriteLine("HTTP/1.0 200 OK");
      this.swResponse.WriteLine("Content-Type: application/json"); 
      this.swResponse.WriteLine("Access-Control-Allow-Origin: *");
      this.swResponse.WriteLine("Access-Control-Allow-Method: GET、POST");
      this.swResponse.WriteLine($"Content-Length: {content.Length.ToString()}");
      this.swResponse.WriteLine("Connection: close");
      this.swResponse.WriteLine("");
      this.swResponse.WriteLine (コンテンツ);
    } 
  • アップロードコールバック中に、アプリケーションサーバーはOSSから送信されたPOSTメッセージに応答します。 スニペットの例:
    public bool VerifySignature()
    {
      // リクエストから承認Base64を取得する
      if (this.httpHeadersDict["authorization"] != null)
      {
        this.strAuthorizationRequestBase64 = this.httpHeadersDict["authorization"].ToString();
      } else if (this.httpHeadersDict["Authorization"] != null) {
        this.strAuthorizationRequestBase64 = this.httpHeadersDict["Authorization"].ToString();
      }
      if (this.strAuthorizationRequestBase64 == "")
      {
        Console.WriteLine (httpリクエストヘッダーの "authorizationプロパティがnullです。 ");
        return false;
      }
    
      // リクエストから承認をデコードする
      this.byteAuthorizationRequest = Convert.FromBase64String(this.strAuthorizationRequestBase64);
    
      // PublicKeyのURLをデコードする
      this.strPublicKeyURLBase64 = this.httpHeadersDict["x-oss-pub-key-url"].ToString();
      var bytePublicKeyURL = Convert.FromBase64String(this.strPublicKeyURLBase64);
      var strAsciiPublickeyURL = System.Text.Encoding.ASCII.GetString(bytePublicKeyURL);
    
      // URLからPublicKeyを取得する
      ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(validateServerCertificate);
      HttpWebRequest request = (HttpWebRequest)WebRequest.Create(strAsciiPublickeyURL);
      HttpWebResponse response = (HttpWebResponse)request.GetResponse();
      StreamReader srPublicKey = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
      this.strPublicKeyBase64 = srPublicKey.ReadToEnd();
      response. 閉じる ();
      srPublicKey.Close();
      this.strPublicKeyContentBase64 = this.strPublicKeyBase64.Replace("----- BEGIN PUBLIC KEY -----\n", ").Replace(" ----- END PUBLIC KEY ----- ", ").Replace("\n", "");
      this.strPublicKeyContentXML = this.RSAPublicKeyString2XML(this.strPublicKeyContentBase64);
    
      // HttpRequestに従って新しい認証文字列を生成する
      文字列 [] arrURL;
      if (this.httpURL.Contains('?'))
      {
        arrURL = this.httpURL.Split('?') ;
        this.strAuthSourceForMD5 = String.Format("{0 }?{ 1}\n{2}" 、System.Web.HttpUtility.UrlDecode(arrURL[0]) 、arrURL[1] 、this.httpBody);
      }
      else
      {
        this.strAuthSourceForMD5 = String.Format("{0}\n{1}" 、System.Web.HttpUtility.UrlDecode(this.httpURL) 、this.httpBody);
      }
    
      // 新しい認可文字列からのMD5ハッシュバイト 
      var byteAuthMD5 = byteMD5Encrypt32(this.strAuthSourceForMD5);
    
      // 署名の確認
      System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider();
      try
      {
        RSA.FromXmlString(this.strPublicKeyContentXML);
      }
      catch (System.ArgumentNullException e)
      {
        throw new ArgumentNullException(String.Format("VerifySignature Failed : RSADeformatter.VerifySignature get null引数: {0} ." 、e));
      }
      catch (System.Security.Cryptography.CryptographicException e)
      {
        throw new System.Security.Cryptography.CryptographicException(String.Format("VerifySignature Failed : RSA.FromXmlString Exception : {0} ." 、e));
      }
      System.Security.Cryptography.RSAPKCS1SignatureDeformatter RSADemformatter=new System.Security.Cryptography.RSAPKCS1SignatureDeformatter(RSA);
      RSADeformatter.SetHashAlgorithm("MD5");
    
      var bVerifyResult = false;
      try
      {
        bVerifyResult = RSADeformatter.VerifySignature(byteAuthMD5, this.byteAuthorizationRequest);
      }
      catch (System.ArgumentNullException e)
      {
        throw new ArgumentNullException(String.Format("VerifySignature Failed : RSADeformatter.VerifySignature get null引数: {0} ." 、e));
      }
      catch (System.Security.Cryptography.CryptographicUnexpectedOperationException e)
      {
        throw new System.Security. CryptographicUnexpectedOperationException(String.Format("VerifySignature Failed : RSADeformatter.VerifySignature Exception : {0} ." 、e));
      }
    
      bVerifyResultを返します。}
    
    public void DoPost()
    {
      this.GetPostBody();
    
      // 署名の確認
      try
      {
        if (this.VerifySignature())
        {
          Console.WriteLine("\nVerifySignature Successful. \n");
    
          // callback_bodyに従って何かをしてください... 
    
          this.HttpResponseSuccess();
        }
        else
        {
          Console.WriteLine("\nVerifySignatureに失敗しました。 \n");
          this.HttpResponseFailure();
        }
      }
      キャッチ
      {
        Console.WriteLine("\nVerifySignatureに失敗しました。 \n");
        this.HttpResponseFailure();
      }
    }