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

我在ASP.NET MVC中有一个控制器,但仅限于管理员角色:


[Authorize(Roles = "Admin")]

public class TestController : Controller

{

   ...

如果没有管理员角色的用户导航到该控制器,则会看到空白屏幕。


我想做的就是将他们重定向到View,上面写着“您必须具有管理员角色才能访问此资源”。


我想到的一种方法是检查IsUserInRole()上的每个操作方法,如果不起作用,则返回此信息视图。但是,我必须将其放入每个会破坏DRY原理并且很麻烦维护的Action中。


杨__羊羊
浏览 496回答 3
3回答

吃鸡游戏

您可以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();

慕丝7291255

“ 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 ...
打开App,查看更多内容
随时随地看视频慕课网APP