1

我正在处理我的第一个 ASP.NET Web API 项目,并且我有一个自定义授权属性正在工作。我要做的是设置属性,以便如果请求是本地的(即调试),则绕过授权检查。

在所有其他 ASP.NET MVC 版本中,我可以检查 Request.IsLocal(甚至 Request.UserHostAddress)以查看请求是否来自本地计算机,但 System.Web.Http.AuthorizeAttribute 仅公开 HttpRequestMessage 对象,这显然没有这些信息,并且似乎还缺少 Request 对象中的一些其他内容。

与 Web API 一起使用的全新(显然是有限的)类的处理是什么,也许更直接的是,如何在我的 Authorize 属性中获取被调用者的主机地址?

4

2 回答 2

5

有几个不同的例子可以在这里这里获取你想要的请求信息,例如

public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        var context = actionContext.Request.Properties["MS_HttpContext"] as System.Web.HttpContextBase;
        bool isLocal = context.Request.IsLocal;

如果这真的只是为了调试,那么在任何仅调试代码周围使用这样的条件语句可能会更安全 - 特别是在安全上下文中......

#if DEBUG 
// 
#endif 

至于为什么......我想这至少部分是为了更容易进行单元测试和模拟,HTTP 上下文是一个 ASP.NET System.Web 构造...... WebApi 被设计为能够作为自托管代码运行独立于 ASP.NET。

于 2012-08-13T07:30:28.023 回答
0

在开发多个中间件组件或支持其他不幸的 IIS 绑定决定使用 HttpContext 或依赖它的人时,我遇到了同样的问题,无论是直接通过 HttpContext 还是通过 MS_HttpContext(这不是 self-主持人)。我编写了一个小型 shim 库来解决这个问题,方法是返回一个适用于这两种情况的 HttpContext。你可以在github和 NuGet上找到它

Install-Package HttpContextShim
于 2012-10-28T01:07:55.083 回答