【问题标题】:How to protect an entire MVC Area by IP/Role/User?如何按 IP/角色/用户保护整个 MVC 区域?
【发布时间】:2013-08-05 16:34:38
【问题描述】:

我知道在控制器顶部的 MVC 中,您可以使用 [Authorize()] 属性将整个控制器的访问权限限制为某些经过身份验证的用户和/或角色,但不能通过 IP,但这必须在每个控制器实例。有没有办法将整个 MVC 区域的访问限制为经过身份验证的用户/角色或请求源 IP?

【问题讨论】:

  • 搜索自定义授权属性
  • 我不想创建自己的属性。我只想采用内置的角色/用户授权控制并在区域级别应用它们。如果我可以在区域级别对 IP 应用一些代码检查也会很好,我知道我可以制作一个 .cs 文件并从每个控制器操作中调用它,但这有点乏味。
  • 您想到了什么“内置角色/用户授权控制”?除了[Authorize] 属性,我想不出任何东西。您可以为您的区域拥有一个基本控制器,让该区域中的所有控制器都派生自该基本控制器,并在基本控制器上添加该自定义授权属性。这将负责整个区域的授权,您可以对其进行自定义以通过 IP 限制
  • 我说的是内置的 ASP.Net 成员资格和角色提供程序。当我查找自定义授权属性时,它似乎主要围绕将其调整为自定义提供程序。我没有考虑制作一个基础控制器来派生,我认为这会很完美。如果您想对此做出回答,我会将其标记为我的解决方案。
  • 请注意,我在接受的答案中更新了 IP 地址逻辑。另外,我没有测试代码,所以可能有错误。

标签: asp.net-mvc-4 asp.net-mvc-areas razor-2


【解决方案1】:

在您的区域创建一个基本控制器:

[AuthorizeArea(AllowIpAddresses = new [] {"1.1.1.1", "1.2.3.4"})]
public class CustomAreaBaseController : Controller
{
    public CustomAreaBaseController()
    {
        // possibly any other common code that you want to run for all controllers in this area
    }
}

让您所在区域的所有控制器都源自基本控制器:

public class HomeController : CustomAreaBaseController
{
    // actions for this controller
}

创建自定义授权属性:

public class AuthorizeArea : AuthorizeAttribute
{
    public string[] AllowIpAddresses { get; set; }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        bool isValid = false;

        if (httpContext == null)
            throw new ArgumentNullException("httpContext");

        // get current ip address
        var ipAddress = httpContext.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
        if (string.IsNullOrEmpty(ipAddress))
            ipAddress = httpContext.Request.ServerVariables["remote_host"];

        if (AllowIpAddresses.Contains(ipAddress)) isValid = true;

        return base.AuthorizeCore(httpContext) && isValid;
    }
}

【讨论】:

  • 我喜欢这种方法。顺便说一句,如果 IP 地址存储在数据库中,您会怎么做?
  • 您必须在此方法中从 db 中检索它们并可能缓存它们。
猜你喜欢
  • 2018-12-04
  • 2020-12-20
  • 2011-10-15
  • 2020-04-11
  • 2013-06-06
  • 1970-01-01
  • 1970-01-01
  • 2012-12-09
  • 1970-01-01
相关资源
最近更新 更多