处理mvc安全性...覆盖成员资格提供者,动作过滤器或其他什么?不知道如何处理这个问题

时间:2010-02-22 20:25:05

标签: asp.net-mvc asp.net-membership

我真的很困惑如何处理ASP .NET MVC应用程序中的安全问题。这就是我知道我想做的事情:

1)我想要自己的架构布局,这样我就可以实现我想要的安全性,而不是依赖于Microsoft的默认数据库架构(我之前看到的不支持其他dbms)。

2)这听起来像是一个矛盾,但我想使用实体框架,是的,MS Sql Server 2005.仅仅因为我这样做,并不意味着我想要被锁定在这些决定中。我见过其他一些dbms供应商提供EF支持,所以这似乎是一个更好的方法。

基本的安全设置非常简单。有用户。用户有角色。我有3个基本表:User,Role,UserRoles。

所以,如果这是一个专业的Web应用程序,我签约创建,这将是一个很好的方法吗?创建自定义成员资格提供程序实现似乎是最彻底的,它似乎是一个相当便携的解决方案。我看过几篇文章谈到只创建一个ActionFilter或CustomAttribute。可能两者是一回事;就像我说的,我真的很困惑。

这里的底线是我试图让自己的技术受到影响,但我希望能够有远见地了解在现实世界中如何做到这一点。我已经浏览了书呆子晚餐示例,并使用默认的成员资格提供程序设置(包括架构),这不是我想要的。

我用Google搜索了这个。我读了很多文章,发现了很多实现。我已经完成了ASP .NET Unleashed,它只是标准的会员提供商解释。我真的只是想从那些已经在工业界做过的人那里找到一些可靠的专业建议。或者做到这一点。

感谢您的时间。

更新

我设法让CSS文件免于身份验证。我将以下内容添加到web.config(应用程序级别)。

  <location path="Content">
    <system.web>
      <authorization>
        <allow users="*" />
      </authorization>
    </system.web>
  </location>
  <location path="~/Views/Account">
    <system.web>
      <authorization >
        <allow users="*"  />
      </authorization>
    </system.web>
  </location>

现在存在一个逻辑问题。我之前在web.config中指示了应用程序,登录URL是:LogOn.aspx。因为,我已经实现了自定义成员资格和提供程序,我想我会使用默认帐户登录页面。该页面为您提供注册新帐户的选项;但是,单击“注册”超级链接只会使您保持在LogOn页面上。显然,新用户不会对此感到高兴。我试图使Views / Account文件夹中的所有页面都不使用上面的xml进行身份验证,但它似乎没有工作。想法?

****************************************再次更新***** ***********************************

显然,Location标记只需要目录名而不是目录树。至少对我来说似乎就是这种情况。我将第二个位置标记更改为如下所示:

  <location path="Account">
    <system.web>
      <authorization >
        <allow users="*"  />
      </authorization>
    </system.web>
  </location>

现在,我可以访问“帐户”视图文件夹中的所有文件,以及所有帐户控制器操作。这里有一个有趣的讽刺:我已经开始创建一个自定义成员资格提供程序实现(我很高兴我做了),所以我可以使用vanilla Register&amp; ASP .NET MVC附带的LogOn页面。我想,如果没有破坏,请不要修理它。那么请告诉我......你们有多么舒服,将这些页面放到生产环境中,只需要很少的改动?只是好奇。我正在试图弄清楚如何做这些事情;我无法真正评估做或使用X是好事还是不行。

1 个答案:

答案 0 :(得分:3)

据我所知,你应该能够毫不费力地做你正在谈论的事情......

因为ASP.Net MVC是建立在ASP.Net之上的,所以你应该能够利用ASP.Net的能力,如你所描述的那样放入你自己的自定义成员资格提供者。一旦创建,要让ASP.Net MVC使用此提供程序,您只需在web.config中注册您的提供程序,只需将现有的Authorize属性添加到您想要锁定的控制器中。

此现有的Authorize属性与给定的提供程序无关,它只是查看哪个提供程序是最新的,在您的情况下,您的自定义提供程序将是当前的。

你说你已经阅读了有关创建自定义提供程序的文章,所以我不会在那里详细说明你不应该创建自定义属性/过滤器(ActionFilter是一个属性,但属性并不总是一个ActionFilter - ActionFilter是一个MVC概念,属性是一个.Net概念 - 希望有所帮助)。

所以看起来你应该拥有实现所需的一切。

如果您需要更多,请告诉我。

更新:

我猜想以下是css的问题 - 我刚刚遇到了一个非常类似的问题...简而言之,我认为MVC正在尝试验证CSS文件的获取,因为你是还没有登录,它不会让你下载CSS。

验证这一点的方法是做类似以下的事情(注意代码在global.asax中):

    public void Application_AuthenticateRequest(object sender, EventArgs e)
    {
        var shouldAuthenticate = true;

        if (Request.Path.Contains("/Error") || Request.Path.Contains(".css") || Request.Path.Contains(".jpg") ||
            Request.Path.Contains(".png") || Request.Path.Contains(".js") || Request.Path.Contains(".gif") || Request.Path.Contains("/asset.axd?id=")) 
            shouldAuthenticate = false;

        ...
    }

当您调试应用程序时,请尝试在此处设置一个断点,并查看每次登录页面加载时调用的次数以及每个“Request.Path”的内容...如果您看到它是试图验证这些资产然后是你的问题。