通常使用授权设置与角色互动。
<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");
}
}
}
可以帮我举个例子吗?
非常感谢您提前
答案 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应用程序中。