在我的MVC应用程序中,我使用HMAC身份验证滤波器向Web API服务发出调用。我的Get(GetMultipleItemsRequest)有效,但我的Post没有。如果我关闭HMAC认证过滤,所有这些过滤器都可以工作。我不确定为什么POSTS不起作用,但GETs可以。

我做的GET电话从我这样的代码(这一个工程):

var productsClient = new RestClient(System.Configuration.ConfigurationManager.AppSettings["WebApiUrl"],

"xxxxxxxxxxxxxxx", true);

var getManyResult = productsClient.GetMultipleItemsRequest("api/Role").Result;

我做出POST调用从我这样的代码(这个只有当我关掉HMAC作品):

private RestClient profileClient = new RestClient(System.Configuration.ConfigurationManager.AppSettings["WebApiUrl"],

"xxxxxxxxxxxxxxx", true);

[HttpPost]

public ActionResult ProfileImport(IEnumerable files)

{

//...

var postResult = profileClient.PostRequest("api/Profile", newProfile).Result;

}

我RESTClient实现建立这样的:

public class RestClient where T : class

{

//...

private void SetupClient(HttpClient client, string methodName, string apiUrl, T content = null)

{

const string secretTokenName = "SecretToken";

client.BaseAddress = new Uri(_baseAddress);

client.DefaultRequestHeaders.Accept.Clear();

client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

if (_hmacSecret)

{

client.DefaultRequestHeaders.Date = DateTime.UtcNow;

var datePart = client.DefaultRequestHeaders.Date.Value.UtcDateTime.ToString(CultureInfo.InvariantCulture);

var fullUri = _baseAddress + apiUrl;

var contentMD5 = "";

if (content != null)

{

var json = new JavaScriptSerializer().Serialize(content);

contentMD5 = Hashing.GetHashMD5OfString(json); //

}

var messageRepresentation =

methodName + "\n" +

contentMD5 + "\n" +

datePart + "\n" +

fullUri;

var sharedSecretValue = ConfigurationManager.AppSettings[_sharedSecretName];

var hmac = Hashing.GetHashHMACSHA256OfString(messageRepresentation, sharedSecretValue);

client.DefaultRequestHeaders.Add(secretTokenName, hmac);

}

else if (!string.IsNullOrWhiteSpace(_sharedSecretName))

{

var sharedSecretValue = ConfigurationManager.AppSettings[_sharedSecretName];

client.DefaultRequestHeaders.Add(secretTokenName, sharedSecretValue);

}

}

public async Task GetMultipleItemsRequest(string apiUrl)

{

T[] result = null;

try

{

using (var client = new HttpClient())

{

SetupClient(client, "GET", apiUrl);

var response = await client.GetAsync(apiUrl).ConfigureAwait(false);

response.EnsureSuccessStatusCode();

await response.Content.ReadAsStringAsync().ContinueWith((Task x) =>

{

if (x.IsFaulted)

throw x.Exception;

result = JsonConvert.DeserializeObject(x.Result);

});

}

}

catch (HttpRequestException exception)

{

if (exception.Message.Contains("401 (Unauthorized)"))

{

}

else if (exception.Message.Contains("403 (Forbidden)"))

{

}

}

catch (Exception)

{

}

return result;

}

public async Task PostRequest(string apiUrl, T postObject)

{

T result = null;

try

{

using (var client = new HttpClient())

{

SetupClient(client, "POST", apiUrl, postObject);

var response = await client.PostAsync(apiUrl, postObject, new JsonMediaTypeFormatter()).ConfigureAwait(false); //

response.EnsureSuccessStatusCode();

await response.Content.ReadAsStringAsync().ContinueWith((Task x) =>

{

if (x.IsFaulted)

throw x.Exception;

result = JsonConvert.DeserializeObject(x.Result);

});

}

}

catch (HttpRequestException exception)

{

if (exception.Message.Contains("401 (Unauthorized)"))

{

}

else if (exception.Message.Contains("403 (Forbidden)"))

{

}

}

catch (Exception)

{

}

return result;

}

//...

}

我的Web API控制器的定义是这样的:

[SecretAuthenticationFilter(SharedSecretName = "xxxxxxxxxxxxxxx", HmacSecret = true)]

public class ProfileController : ApiController

{

[HttpPost]

[ResponseType(typeof(Profile))]

public IHttpActionResult PostProfile(Profile Profile)

{

if (!ModelState.IsValid)

{

return BadRequest(ModelState);

}

GuidValue = Guid.NewGuid();

Resource res = new Resource();

res.ResourceId = GuidValue;

var data23 = Resourceservices.Insert(res);

Profile.ProfileId = data23.ResourceId;

_profileservices.Insert(Profile);

return CreatedAtRoute("DefaultApi", new { id = Profile.ProfileId }, Profile);

}

}

这里是一些什么SecretAuthenticationFilter做:

//now try to read the content as string

string content = actionContext.Request.Content.ReadAsStringAsync().Result;

var contentMD5 = content == "" ? "" : Hashing.GetHashMD5OfString(content); //

var datePart = "";

var requestDate = DateTime.Now.AddDays(-2);

if (actionContext.Request.Headers.Date != null)

{

requestDate = actionContext.Request.Headers.Date.Value.UtcDateTime;

datePart = requestDate.ToString(CultureInfo.InvariantCulture);

}

var methodName = actionContext.Request.Method.Method;

var fullUri = actionContext.Request.RequestUri.ToString();

var messageRepresentation =

methodName + "\n" +

contentMD5 + "\n" +

datePart + "\n" +

fullUri;

var expectedValue = Hashing.GetHashHMACSHA256OfString(messageRepresentation, sharedSecretValue);

// Are the hmacs the same, and have we received it within +/- 5 mins (sending and

// receiving servers may not have exactly the same time)

if (messageSecretValue == expectedValue

&& requestDate > DateTime.UtcNow.AddMinutes(-5)

&& requestDate < DateTime.UtcNow.AddMinutes(5))

goodRequest = true;

任何想法,为什么HMAC不为岗位工作?

编辑:

当SecretAuthenticationFilter尝试比较发送的HMAC与它认为HMAC应该是他们不匹配。原因是内容的MD5Hash与接收内容的MD5Hash不匹配。 RestClient使用JavaScriptSerializer.Serialized内容版本对内容进行散列处理,但是PostRequest将对象作为JsonMediaTypeFormatted传递。

这两种类型的格式不一样。例如,JavaScriptSerializer给在美国的历史可以是这样的: \ “EnteredDate \”:\ “\ /日期(1434642998639)\/\”

所传递的内容有日期如下: \ “EnteredDate \”:\ “2015-06-18T11:56:38.6390407-04:00 \”

我想我需要哈希使用传递的相同数据,因此另一端的过滤器可以正确地确认它。思考?

编辑: 找到答案,我需要使用此线改变SetupClient代码:

var json = new JavaScriptSerializer().Serialize(content);

contentMD5 = Hashing.GetHashMD5OfString(json);

要使用这样的:

var json = JsonConvert.SerializeObject(content);

contentMD5 = Hashing.GetHashMD5OfString(json);

现在发送的内容(通过JSON格式)将匹配散列的内容。

我原来并不是这位代码的人。:)

+0

检查WebDav模块是否已安装。如果是,请卸载并重试。 –

c# forbidden.html,C#Web API方法返回403 Forbidden相关推荐

  1. soap协议_当SOAP遇上REST!一文解读Web服务Web API方法

    当SOAP遇上REST!一文解读eb服务和Web API方法 SOAP和REST,也许您已经很熟悉它们,希望扩展您的知识或获取新的观点.或者,也许您听说过它们,并正在寻求更好的理解.毕竟,SOAP和R ...

  2. 用于将带有查询字符串的复杂对象传递到Web API方法的自定义模型绑定器

    目录 介绍 查询复杂对象的字符串字段 使用和测试FieldValueModelBinder类 FieldValueModelBinder如何工作? 获取源字段和值 将字段部分与对象属性匹配 解析枚举类 ...

  3. Web Api 中返回JSON的正确做法

    在使用Web Api的时候,有时候只想返回JSON:实现这一功能有多种方法,本文提供两种方式,一种传统的,一种作者认为是正确的方法. JSON in Web API – the formatter b ...

  4. ASP.Net Core Web API 如何返回 File。

    咨询区 Jan Kruse: 我想在 ASP.Net Web API 中返回 File 文件,我目前的做法是将 Action 返回值设为 HttpResponseMessage,参考代码如下: pub ...

  5. java403forbidden_java – Spring boot – 返回403 Forbidden而不是重定向到登录页面

    在Spring Boot Web应用程序中,我有以下安全配置: @Override public void configure(HttpSecurity http) throws Exception ...

  6. 配置https后访问返回403 forbidden

    今天在配置https的时候配置好,http能访问,https访问返回403 forbidden: 网上找了很多,改nginx.conf的user的 修改配置文件的 其实就是权限问题,是网站根目录的权限 ...

  7. 在ASP.NET Web API中返回错误的最佳实践

    本文翻译自:Best practice to return errors in ASP.NET Web API I have concerns on the way that we returns e ...

  8. webapi输出炜json_asp.net web api只返回json数据格式

    asp.net web api默认是同时支持返回xml和json数据格式的.这种机制是因为有web api框架中的SupportedMediaTypes的存在. 具体返回什么样的数据格式,你可以在请求 ...

  9. img 标签 访问图片 返回403 forbidden问题,meta标签的说明

    1.异常信息 2.解决方案 <meta name="referrer" content="no-referrer" /><!--页面头部添加- ...

  10. img 标签 访问图片 返回403 forbidden问题

    之前在项目里,本地调试的时候,图片src引用了第三方网站的图片资源,导致控制台出现了如下的报错: 403 forbidden,说明了这个网络资源这样获取是被拒绝的,那么通过简单的百度,找到了相关的解决 ...

最新文章

  1. 利用SQL建立数据库对象
  2. Day3-python基础3
  3. Linux Bash 笔记
  4. AsyncLocal 与 async await
  5. G - Bad Hair Day (单调栈)
  6. CG-CTF-Web-bypass again
  7. 主席树——多棵线段树的集合
  8. 汇编语言上机考试三星题——加密的key和明文字符串(二)
  9. vsto mysql_VSTO安装部署(完美解决XP+2007)
  10. RTthread IO设备的创建
  11. Android 腾讯地图定位功能一二三
  12. 解决phpmyadmin加载慢问题
  13. ansys部分边界条件详解
  14. mongo E11000 duplicate key error collection
  15. JAVA的jdk1.8中文文档
  16. 不知道买啥绘本?适合3-6岁儿童的绘本书单,建议父母收藏
  17. 关于出现 linux Table is marked as crashed and should be repaired
  18. Linux测试工具httpd-tools
  19. 站在营销看工作,偶发几点小心得
  20. webug 4.0 第九关 反射型xss

热门文章

  1. tomcat安全加固手册
  2. MySQL8的URL和Driver的写法
  3. 第六讲 复数和复指数
  4. 命令提示符 查看已连接Wifi密码(忘记Wifi密码)
  5. PgAdmin导入导出单表数据---解决PgAdmin导入单表数据报错乱码问题
  6. Zabbix报告无交换内存主机“Lack of free swap space”问题解决
  7. android银联支付
  8. mybatis用注解实现 一对一,一对多,多对多哟
  9. 教育专家妙论生命法则
  10. 数据获取以及处理Beta版本展示