このトピックでは、で署名を計算する方法について説明します。サーバーでNETを使用し、アップロードコールバックを設定し、フォームアップロードを使用してデータをOSSにアップロードします。
前提条件
- アプリケーションサーバのドメイン名は、インターネットを介してアクセス可能である。
- アプリケーションサーバーにVisual Studio 2012以降がインストールされています。
- アプリケーションサーバーは Net Framework 4.5以降がインストールされます。
手順1: アプリケーションサーバーの設定
- アプリケーションサーバーのソースコードをダウンロードします。. NET.
- この例では、Windowsシステムが使用されています。 ソースコードをC:\callback-server-dotnetディレクトリに解凍します。
- ディレクトリに移動します。 ソースコードを含む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: 同じ名前の既存のオブジェクトが上書きされないように、オブジェクトのプレフィックスを指定します。 このパラメーターを指定しないままにすることもできます。
- Visual Studioを使用して、aliyun-oss-net-callback-server.slnファイルを開きます。 [有効化] をクリックして、実行可能ファイルaliyun-oss-net-callback-server.exeを生成します。
ステップ2: クライアントの設定
- クライアントソースコードをダウンロードします。
- パッケージをディレクトリに解凍します。 この例では、
D:\aliyun\aliyun-oss-appserver-js
ディレクトリが使用されています。 - ディレクトリに移動します。
upload.js
ファイルを開きます。 次のコードを見つけます。// serverUrlは、署名やポリシーなどの情報を取得するために使用されるアプリケーションサーバーのURLを指定します。 IPアドレスとポート番号を実際の情報に置き換えます。 serverUrl = 'http:// 192.168.0.1:8888 '
severUrl
をアプリケーションサーバーのURLに設定します。 この例では、serverUrl = 'http:// 10.10.10.10:1234 '
を指定します。
ステップ3: CORS設定の変更
フォームアップロードを使用してクライアントからOSSにデータをアップロードする場合、クライアントはリクエストにOrigin
ヘッダーを含め、ブラウザーを使用してリクエストをOSSに送信します。 OSSは、クロスオリジンリソース共有 (CORS) 検証用のOrigin
ヘッダーを含むリクエストメッセージを検証します。 POSTメソッドを使用するには、バケットのCORSルールを設定します。
ステップ4: アップロードコールバック要求を送信する
- アプリケーションサーバーを起動します。アプリケーションサーバーのコマンドラインで、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。
- クライアントを起動します。
- PCで、クライアントのソースコードを含むディレクトリにあるindex.htmlファイルを開きます。重要 index.htmlファイルは、Internet Explorer 10以前と互換性がない場合があります。 Internet Explorer 10以前を使用するときに問題が発生した場合は、デバッグを実行する必要があります。
- [ファイルの選択] をクリックします。 指定したタイプのファイルを選択します。 [アップロード] をクリックします。オブジェクトがアップロードされると、コールバックサーバーによって返されたコンテンツが表示されます。
- PCで、クライアントのソースコードを含むディレクトリにあるindex.htmlファイルを開きます。
アプリケーションサーバのコアコード解析
アプリケーションサーバーのソースコードは、署名ベースのアップロードとアップロードコールバックを実装するために使用されます。
- 署名ベースのアップロード中、アプリケーションサーバーはクライアントから送信された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(); } }