【问题标题】:Limit access to web api 2 controller in dotnet core mvc project在 dotnet core mvc 项目中限制对 web api 2 控制器的访问
【发布时间】:2017-12-09 00:01:48
【问题描述】:

限制对 MVC 项目中 webapi 2 控制器的访问仅限于托管的应用服务的最佳方法是什么?

我创建了一个我的 MVC 客户端正在访问的端点。整个应用程序通过应用服务发布到 Azure。我现在如何保护端点不被应用程序上下文之外的调用?

【问题讨论】:

  • 您只想允许来自特定 IP 地址的 HTTP 调用?
  • 听起来像是设计问题。您确定 Web API 是您想要的吗?
  • 它是通过Visual Studio创建的标准MVC项目。我不想使用 Razorpages,而是使用 Web API 和 Javascript 来调用它。但是,我想保持简单,并确保仅从我的页面处理请求。
  • 如果你有一个 UI 并且你不想让其他东西运行代码,为什么不在控制器中处理它而不使用 Web API。 API 是为了允许其他应用程序与您的应用程序交互,但这是您明确表示不想要的。
  • 所以我猜对了,您有一个 MVC 客户端正在访问的 Web API,并且这两者都托管在应用服务中。您只希望 MVC 客户端有权访问 API 吗?

标签: c# asp.net-mvc azure asp.net-web-api asp.net-core


【解决方案1】:

根据您的 cmets,您应该考虑重构您的解决方案。

  • 考虑将您的 Web API 移至独立项目。通过这种方式,您的 API 与 MVC 应用程序分离,您可以根据需要独立部署和扩展它。
  • 将 MVC 客户端应用程序移到它自己的独立项目中
  • 对于身份验证,我会考虑实现一个授权服务器(同样在一个独立项目中),它向客户端(在您的情况下为 MVC 应用程序)颁发令牌,然后客户端将使用此令牌访问 API。要实现身份验证服务器,您有几个选项

拥有一个专用的授权服务器清楚地分离了身份责任,允许您控制对其他未来客户端的访问,并可能限制对某些端点(也称为范围)的访问。

【讨论】:

    【解决方案2】:

    您可以在请求的标头中使用 API 密钥来过滤掉不需要的请求。 1.实现一个客户授权属性(AuthorizationFilter)类。

        [HttpPost, AuthorizationFilter]
        public CustomerInfo GetCustomerInfo(CustomerInfoRequest request)
        {
            return Business.GetCustomerInfo(request);
        }
    

    2。在你的控制器类中

        public override void OnAuthorization(HttpActionContext ctx)
        {            
            if (!VerifyHeaders(ctx))
            {
                ctx.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
                return;
            }
    
            base.OnAuthorization(ctx);
        }
    
        private bool VerifyHeaders(HttpActionContext ctx)
        {
            IEnumerable<string> values = new List<string>();
    
            //Read the API key from the request header
            ctx.Request.Headers.TryGetValues("ApiKey", out values);
            var apiKey = values?.FirstOrDefault();        
    
            return CheckApiKey(apiKey);
        }
    
        private bool CheckApiKey(string apiKey)
        {
            //Verification is done here
            return true;
        }
    
    1. 请求应包含 API 密钥,该密钥将通过“OnAuthorization”方法进行验证。

    【讨论】:

      猜你喜欢
      • 2019-01-06
      • 1970-01-01
      • 2018-01-06
      • 2019-05-26
      • 1970-01-01
      • 1970-01-01
      • 2019-11-05
      • 1970-01-01
      • 2020-10-16
      相关资源
      最近更新 更多