使用C#语言进行后端服务签名时,您需要先获取SDK,然后打开工程,最后参考校验后端签名示例校验签名是否一致。
双击SDK包中的“csharp.sln”文件,打开工程。工程中包含如下3个项目:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | // ValuesController.cs
namespace backend_signature.Controllers
{
[Route("api/[controller]")]
[ApiController]
[ApigatewaySignatureFilter]
public class ValuesController : ControllerBase
{
// GET api/values
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
return new string[] { "value1", "value2" };
}
// POST api/values
[HttpPost]
public void Post([FromBody] string value)
{
}
// PUT api/values/5
[HttpPut("{id}")]
public void Put(int id, [FromBody] string value)
{
}
// DELETE api/values/5
[HttpDelete("{id}")]
public void Delete(int id)
{
}
}
}
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | // ApigatewaySignatureFilter.cs
namespace backend_signature.Filters
{
public class ApigatewaySignatureFilter : Attribute, IAuthorizationFilter
{
private Dictionary<string, string> secrets = new Dictionary<string, string>
{
{"signature_key1", "signature_secret1" },
{"signature_key2", "signature_secret2" },
};
public void OnAuthorization(AuthorizationFilterContext context) {
//签名校验代码
...
}
}
}
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | private Regex authorizationPattern = new Regex("SDK-HMAC-SHA256\\s+Access=([^,]+),\\s?SignedHeaders=([^,]+),\\s?Signature=(\\w+)");
...
string authorization = request.Headers["Authorization"];
if (authorization == null)
{
context.Result = new UnauthorizedResult();
return;
}
var matches = authorizationPattern.Matches(authorization);
if (matches.Count == 0)
{
context.Result = new UnauthorizedResult();
return;
}
var groups = matches[0].Groups;
string key = groups[1].Value;
string[] signedHeaders = groups[2].Value.Split(';');
|
例如,Authorization头为:
1 | SDK-HMAC-SHA256 Access=signature_key1, SignedHeaders=host;x-sdk-date, Signature=e11adf65a20d1b82c25419b5********8d0ba12fed1ceb13ed00
|
则解析的结果为:
1 2 | signingKey=signature_key1
signedHeaders=host;x-sdk-date
|
1 2 3 4 5 6 | if (!secrets.ContainsKey(key))
{
context.Result = new UnauthorizedResult();
return;
}
string secret = secrets[key];
|
需要读取body的条件为:不存在值为UNSIGNED-PAYLOAD的x-sdk-content-sha256头。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | HttpRequest sdkRequest = new HttpRequest();
sdkRequest.method = request.Method;
sdkRequest.host = request.Host.Value;
sdkRequest.uri = request.Path;
Dictionary<string, string> query = new Dictionary<string, string>();
foreach (var pair in request.Query)
{
query[pair.Key] = pair.Value;
}
sdkRequest.query = query;
WebHeaderCollection headers = new WebHeaderCollection();
string dateHeader = null;
bool needBody = true;
foreach (var h in signedHeaders)
{
var value = request.Headers[h];
headers[h] = value;
if (h.ToLower() == "x-sdk-date")
{
dateHeader = value;
}
if (h.ToLower() == "x-sdk-content-sha256" && value == "UNSIGNED-PAYLOAD")
{
needBody = false;
}
}
sdkRequest.headers = headers;
if (needBody)
{
request.EnableRewind();
using (MemoryStream ms = new MemoryStream())
{
request.Body.CopyTo(ms);
sdkRequest.body = Encoding.UTF8.GetString(ms.ToArray());
}
request.Body.Position = 0;
}
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | private const string BasicDateFormat = "yyyyMMddTHHmmssZ";
...
if(dateHeader == null)
{
context.Result = new UnauthorizedResult();
return;
}
DateTime t = DateTime.ParseExact(dateHeader, BasicDateFormat, CultureInfo.CurrentCulture);
if (Math.Abs((t - DateTime.Now).Minutes) > 15)
{
context.Result = new UnauthorizedResult();
return;
}
|
1 2 3 4 5 6 7 | Signer signer = new Signer();
signer.Key = key;
signer.Secret = secret;
if (!signer.Verify(sdkRequest, groups[3].Value))
{
context.Result = new UnauthorizedResult();
}
|
填入如图所示字段后,单击“Send request”,复制生成的curl命令,并在命令行中执行,服务器返回200。
如果使用错误的Key和Secret访问,服务器返回401认证不通过。
本文介绍弹性高性能计算产品功能和对应的文档动态。 2021年3月 功能名称 功能概...
问题现象 在配置管理中命名空间ID spring.cloud.nacos.config.namespace 失败。 ...
善用工具,省时省力! 一、Metabase 它在Github星数上万,适合业务人员使用,界面...
ContainerOps中用户权限分为三类: 读取:只能查看和启动流水线。 编辑:查看、...
1. 概述 标准运维V3是通过可视化的图形界面进行任务流程编排和执行的系统,是腾...
操作场景 在您开启了云审计服务后,系统开始记录云服务资源的操作。云审计服务管...
2月25日,2019中国国际大数据产业博览会(以下简称数博会)新闻发布会在北京国家...
概述 调用说明 终端节点 约束与限制 基本概念...
1. 接口描述 接口请求域名: lighthouse.tencentcloudapi.com 。 本接口(Descri...
近日,高德地图联合国家信息中心大数据发展部、清华大学戴姆勒可持续交通联合研...