代码之家  ›  专栏  ›  技术社区  ›  jason

处理MVC安全性…重写成员资格提供程序、操作筛选器或其他内容?不知道怎么处理这个

  •  2
  • jason  · 技术社区  · 16 年前

    我对如何在我的ASP.NET MVC应用程序中处理安全性感到非常困惑。我知道我想做的是:

    1)我需要自己的模式布局,这样我就可以按照自己的方式实现安全性,而不必绑定到Microsoft的默认DB模式(我在其他DBMS上几乎看不到这一点)。

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

    基本的安全设置相当简单。有用户。用户具有角色。我有三个基本表:用户、角色、用户角色。

    所以,如果这是一个我签约创建的专业Web应用程序,那么有什么好方法可以做到这一点呢?创建自定义成员资格提供程序实现似乎是最彻底的,而且它似乎是一个相当可移植的解决方案。我已经看到几篇文章讨论了创建actionfilter或customattribute。也许这两件事是一样的,就像我说的,我真的很困惑。

    这里的底线是,我正在努力让自己的脚在这项技术,但我希望有远见,知道这将如何在现实世界中完成。我已经介绍了Nerd Diner示例,它使用默认的成员资格提供程序设置(包括模式),这不是我在这里想要的。

    我在谷歌上搜索过这个。我读了几十篇文章,发现了许多实现。我已经学习了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。因为,我已经实现了一个自定义的成员身份和提供者,所以我想使用默认的帐户登录页面。该页面为您提供了注册新帐户的选项;但是,单击“注册”超链接只会使您留在登录页面上。显然,新用户不会对此感到高兴。我试图使视图/帐户文件夹中的所有页面都不能通过上面的XML进行身份验证,但它似乎没有起作用。思想?

    再次更新*******

    显然,位置标记只需要目录名,而不需要目录树。至少对我来说是这样。我把第二个位置标签改成这样:

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

    现在我可以访问帐户视图文件夹中的所有文件,以及所有帐户控制器操作。这里有一个有趣的讽刺:我已经着手创建了一个自定义成员资格提供程序实现(我很高兴我这样做了),所以我可以使用ASP.NET MVC附带的普通注册和登录页面。我想,如果它没有坏,就不要修。那么,告诉我……你们中的任何人将这些页面放到一个只有最小变化的生产环境中会有多舒服?只是好奇而已。我正处在这样一个时刻,我只是想弄清楚如何做这些事情;我不能真正评估做或使用X是一件好事还是还不太好。

    1 回复  |  直到 16 年前
        1
  •  3
  •   anthonyv    16 年前

        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;
    
            ...
        }