为了账号安全,请及时绑定邮箱和手机立即绑定

在ASP.NET MVC中重定向未经授权的控制器

在ASP.NET MVC中重定向未经授权的控制器

C#
杨__羊羊 2019-12-12 14:26:56
我在ASP.NET MVC中有一个控制器,但仅限于管理员角色:[Authorize(Roles = "Admin")]public class TestController : Controller{   ...如果没有管理员角色的用户导航到该控制器,则会看到空白屏幕。我想做的就是将他们重定向到View,上面写着“您必须具有管理员角色才能访问此资源”。我想到的一种方法是检查IsUserInRole()上的每个操作方法,如果不起作用,则返回此信息视图。但是,我必须将其放入每个会破坏DRY原理并且很麻烦维护的Action中。
查看完整描述

3 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

您可以HandleUnauthorizedRequest在自定义中使用可覆盖的内容AuthorizeAttribute


像这样:


protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)

{

    // Returns HTTP 401 by default - see HttpUnauthorizedResult.cs.

    filterContext.Result = new RedirectToRouteResult(

    new RouteValueDictionary 

    {

        { "action", "YourActionName" },

        { "controller", "YourControllerName" },

        { "parameterName", "YourParameterValue" }

    });

}

您还可以执行以下操作:


private class RedirectController : Controller

{

    public ActionResult RedirectToSomewhere()

    {

        return RedirectToAction("Action", "Controller");

    }

}

现在,您可以通过HandleUnauthorizedRequest以下方式在您的方法中使用它:


filterContext.Result = (new RedirectController()).RedirectToSomewhere();


查看完整回答
反对 回复 2019-12-12
?
慕丝7291255

TA贡献1859条经验 获得超6个赞

“ tvanfosson”的代码给了我“执行子请求时出错”。我这样更改了OnAuthorization:


public override void OnAuthorization(AuthorizationContext filterContext)

    {

        base.OnAuthorization(filterContext);


        if (!_isAuthorized)

        {

            filterContext.Result = new HttpUnauthorizedResult();

        }

        else if (filterContext.HttpContext.User.IsInRole("Administrator") || filterContext.HttpContext.User.IsInRole("User") ||  filterContext.HttpContext.User.IsInRole("Manager"))

        {

            // is authenticated and is in one of the roles 

            SetCachePolicy(filterContext);

        }

        else

        {

            filterContext.Controller.TempData.Add("RedirectReason", "You are not authorized to access this page.");

            filterContext.Result = new RedirectResult("~/Error");

        }

    }

这很好用,我在错误页面上显示了TempData。感谢“ tvanfosson”的代码片段。我正在使用Windows身份验证,_isAuthorized只是HttpContext.User.Identity.IsAuthenticated ...


查看完整回答
反对 回复 2019-12-12
  • 3 回答
  • 0 关注
  • 493 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信