我创建了以下ActionFilterAttribute
以检查是否授予用户访问页面的权限。我还创建了两个自定义Exceptions
来处理不同的方案:NotLoggedInException
和InsufficientPrivilegeException
。
ActionFilterAttribute
Public Class ValidateAuthentication : Inherits ActionFilterAttribute
Private _page As BLL.Page
Public Sub New(ByVal Page As BLL.Page)
Me._page = Page
End Sub
Public Overrides Sub OnActionExecuting(ByVal filterContext As System.Web.Mvc.ActionExecutingContext)
Select Case Me._page.IsAccessibleToUser(filterContext.HttpContext.User)
Case -1
Throw New NotLoggedInException()
Case 0
Throw New InsufficientPrivilegeException()
Case 1
//access granted
End Select
End Sub
End Class
我还有一个自定义的SiteMapProvider,我在其中实现了自己的IsAccessibleToUser()函数。所以我也有securityTrimming。
SiteMapProvider
Public Overrides Function IsAccessibleToUser(ByVal context As System.Web.HttpContext, ByVal node As System.Web.SiteMapNode) As Boolean
Dim p As New BLL.Page
p.LoadFromSiteMapNode(node)
Select case p.IsAccessibleToUser(context.User)
Case 1
Return true
Case else
Return false
End Select
End Function
问题:
注意:正如您所看到的,我正在为BLL.Page使用自定义类。这是一个ORM页面,其中包含存储在数据库中的基于角色的安全性。还会根据此数据填充SiteMap
答案 0 :(得分:4)
不要重新发明AuthoriazeAttribute
。您的版本不会处理缓存的操作;内置的AuthorizeAttribute
会。 If you need to customize your authentication, then customize the membership provider or subtype AuthorizeAttribute
,而不是重塑MVC安全。