0

我了解到我可以将用户重定向到不同的页面,例如http://www.asp.net/web-forms/tutorials/security/membership/user-based-authorization-vb但我想知道是否有更好的方法? 另外,我怎样才能只发送一条错误消息,而不是重定向到不同的视图?

例如,这是我的代码:

<Authorize(Roles:="Administrator")>
Public Class CompanyController

如果用户登录但没有正确的凭据,我可以添加类似错误消息的内容吗?我可以在 ViewBag.Error 中设置错误吗?谢谢你的帮助。

4

2 回答 2

2

Authorize 属性的要点是在不允许用户访问时阻止对控制器操作的访问。它根本不执行操作并默认重定向到 LogOn 操作。原始动作未执行的事实意味着视图未呈现。

如果您不想重定向到 LogOn 操作但创建一些将呈现的自定义视图,您可以编写自定义 Authorize 属性并覆盖HandleUnauthorizedRequest方法:

Public Class MyAuthorizeAttribute
    Inherits AuthorizeAttribute

    Protected Overrides Sub HandleUnauthorizedRequest(filterContext As AuthorizationContext)
        Dim result = New ViewResult()
        result.ViewName = "Forbidden"
        result.ViewBag.ErrorMessage = "oops, you are not allowed"
        filterContext.Result = result
End Sub
End Class

然后定义~/Views/Shared/Forbidden.vbhtml将被渲染的视图:

<h3>@ViewBag.ErrorMessage</h3>

最后用这个自定义属性装饰你的控制器:

<MyAuthorize(Roles:="Administrator")>
Public Class CompanyController
于 2012-07-28T06:31:00.833 回答
0

你总是可以在 MVC 中创建你自己的授权过滤器,然后做任何你需要的事情。

您将需要创建一个实现IAuthorizationFilter的类。如果您想要这样做,您可以让此授权过滤器向 ViewBag.Error 添加内容,而不是重定向到另一个操作。不过,如果您不为用户提供身份验证方式,我不确定该消息会有多大用处。

于 2012-07-27T21:26:44.373 回答