я создал следующее 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
Вопросы:
- Где я могу поймать исключения, например, для перенаправления пользователей, если они не авторизованы?
- Должен ли я использовать авторизацию SiteMap где-то еще вместо использования ActionFilterAttribute и создания исключений ..?
примечание: как вы можете видеть, я использую пользовательский класс для BLL.Page.Это страница ORM с защитой на основе ролей, которая хранится в базе данных.SiteMap также заполняется на основе этих данных