【问题标题】:How to Custom Authorization from database如何从数据库自定义授权
【发布时间】:2012-10-25 14:27:04
【问题描述】:

通常使用授权设置与角色交互。

<location path="Register.aspx">
  <system.web>
    <authorization>
      <allow roles="Administrator"/>
      <deny users="?"/>
    </authorization>
  </system.web>
</location>

但我想在表中的数据库中进行此设置

tblAuthorization
-IdAuthorization (Identy(1,1))
-IdCompany=5
-IdRol=5 (Administrator”)
-Path=”Register.aspx”

是否有一个班级可以做到这一点?有类似 Profile, RoleProvider ..

<roleManager enabled="true"  defaultProvider="MyAccessRolProvider">
   <providers>
      <clear />
      <add name="MyAccessRolProvider" type="MyAccessRolProvider" connectionStringName="MyConnectionString" applicationName="/" />
      <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" />
   </providers>
</roleManager>

目前我认为唯一可以在 Page_Load 事件中实现验证的方法 如果重定向无效,但我会做得更“专业”

protected void Page_Load(object sender, EventArgs e)
{
   if (!IsPostBack)
   {
      if(!ValidateAuthorization())
      {
          Response.Redirect("Login.aspx");
      }
   }
}

可以帮我举个例子吗?

非常感谢您

【问题讨论】:

    标签: c# asp.net webforms asp.net-membership roleprovider


    【解决方案1】:

    您最好的选择是实施自定义 RoleProvider - 您似乎正朝着这个方向前进,因为您的问题包括带有自定义 RoleProvider (MyAccessRolProvider) 的配置部分。

    您需要指定 RoleProvider 的完全限定名称,例如MyNamespace.MyAccessRoleProvider, MyAssembly.

    MSDN describes how to do this, including a sample implementation.

    【讨论】:

      【解决方案2】:

      了解您在页面级别进行授权后,您可以添加一个 HTTP 模块 (IHttpModule) 并使用您的模块进行授权检查。如果授权失败,您可以酌情重定向。

      这样的事情可能会奏效:

      public class MyAuthorizationModule : IHttpModule
      {
      
          public void Init(HttpApplication application)
          {
              application.AuthorizeRequest += (new EventHandler(AuthorizeRequest));
          }
      
          private void AuthorizeRequest(Object source, EventArgs e)
          {
              bool isAuthorized = //your code here to check page authorization
      
              if (!isAuthorized) 
              {  
                  var response = //will need to get current response
                  response.Redirect("Login.aspx", true);
              }
          }
      }
      

      注意:不要忘记您需要将模块添加到您的网络应用程序中。

      【讨论】:

        【解决方案3】:

        据我所知,没有开箱即用的支持,但是我建议您实现以下内容:

        创建一个派生自 AuthorizeAttribute 的新类,添加一个 ID 属性并覆盖“AuthorizeCore”方法。

          public class CustomAutorizeAttribute : AuthorizeAttribute
                {
                    public Guid ActionId { get; set; }
        
                    protected override bool AuthorizeCore(HttpContextBase httpContext)
                    {
                        //Check user has access to action with ID = ActionId
                        //implementation omitted
                    }
                }
        

        您可以添加一个新的数据库表来保存操作及其关联的 ID 值。您可以手动将记录添加到表中,也可以使用反射编写一些代码来执行此操作(如果您有很多操作并且将来可能会添加更多操作,我会建议您这样做)。

        完成此操作后,您可以为用户或应用程序角色分配对这些操作的访问权限。

        在您的自定义 Authorize 属性中,您必须检查用户是否有权访问从 AuthorizeCore 方法相应地返回 true 或 false 的给定操作。

        我建议在用户登录时获取用户可以访问的所有操作的集合,并将它们存储在服务器缓存或某种分布式缓存中,这样您就不会在每次请求时都访问数据库。

        更新 - 抱歉刚刚意识到您使用的是 ASP.NET 表单而不是 MVC。我的方法是针对 MVC 应用程序,因此它可能不相关,但我会将其保留在这里,以防任何 MVC 开发人员碰巧遇到您的问题。

        【讨论】:

          猜你喜欢
          • 2020-06-03
          • 1970-01-01
          • 2021-10-08
          • 2022-12-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-08-29
          • 2015-01-30
          相关资源
          最近更新 更多