如何从数据库自定义授权

时间:2012-10-25 14:27:05

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

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

<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");
      }
   }
}

可以帮我举个例子吗?

非常感谢您提前

3 个答案:

答案 0 :(得分:1)

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

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

MSDN describes how to do this, including a sample implementation

答案 1 :(得分:0)

据我所知,目前没有开箱即用的支持,但我建议您按照以下方式实施:

创建一个派生自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
            }
        }

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

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

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

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

更新 - 抱歉刚刚意识到你使用的是ASP.NET Forms而不是MVC。我的方法是针对MVC应用程序,所以它可能不相关,虽然我会把它留在这里,以防任何MVC开发人员碰巧遇到你的问题。

答案 2 :(得分:0)

了解您正在页面级别进行授权,您可以添加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);
        }
    }
}

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