1

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

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

可以帮我举个例子吗?

非常感谢您提前

4

3 回答 3

1

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

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

MSDN 描述了如何做到这一点,包括一个示例实现

于 2012-11-08T18:44:16.333 回答
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
            }
        }

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

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

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

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

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

于 2012-11-08T16:56:12.247 回答
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 应用程序中。

于 2012-11-08T17:13:34.753 回答