加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – ASP.NET MVC从控制器抛出并处理错误

发布时间:2020-12-16 09:34:15 所属栏目:asp.Net 来源:网络整理
导读:在我的控制器中,让我们说编辑用户.在我的控制器中,我检查用户是否有权编辑然后我想抛出某种身份验证或禁止的错误,这将导致错误页面. 有没有办法做到这一点,而不是仅为错误创建控制器和操作?这样做的正确方法是什么? 解决方法 以下是您可以使用的自定义授权
在我的控制器中,让我们说编辑用户.在我的控制器中,我检查用户是否有权编辑然后我想抛出某种身份验证或禁止的错误,这将导致错误页面.

有没有办法做到这一点,而不是仅为错误创建控制器和操作?这样做的正确方法是什么?

解决方法

以下是您可以使用的自定义授权属性的示例:

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            // if the user is not authenticated render the AccessDenied view
            filterContext.Result = new ViewResult { ViewName = "AccessDenied" };
        }
    }
}

然后用这个属性装饰你的控制器动作:

[CustomAuthorizeAttribute]
public ActionResult SomeAction() 
{ 
    ...
}

您应该注意这种方法的一个警告.如果用户未被授权,则服务器发送200状态代码,该代码不是非常友好的SEO.发送401状态代码会更好.问题是,如果您使用表单身份验证,则会有一个自定义模块附加到ASP.NET执行管道,每当服务器发送401状态代码时,它就会被拦截并自动重定向到登录页面.此功能是设计使然,不是ASP.NET MVC中的错误.它一直都是这样的.

事实上,有一种方法可以解决这种不愉快的情况:

您可以像这样修改自定义授权过滤器:

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            // if the user is not authenticated render the AccessDenied view
            filterContext.HttpContext.Items["unauthorized"] = true;
        }
    }
}

在Global.asax中:

protected void Application_EndRequest()
{
    if (Context.Items.Contains("unauthorized"))
    {
        Context.Response.Clear();
        Context.Response.StatusCode = 401;
        Context.Server.Transfer("~/401.htm");
    } 
}

现在那更好了.您将获得具有自定义错误页面的401状态代码.尼斯.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读