我有一个具有Authorize属性的控制器,如下所示:
[Authorize(Roles = "Viewer")]
public class HomeController : Controller
{
//...
}
我的web.config的customErrors设置如下:
<customErrors mode="On">
<error statusCode="401" redirect="notauthorized.html"/>
</customErrors>
当我尝试使用非授权角色在Home控制器上调用操作时,我只得到一个空白页面。我没有被重定向到自定义页面。 有什么想法吗?
答案 0 :(得分:12)
我很欣赏这个问题有点旧,但这可能有助于某人。
对于401,您可能会看到标准的401 Unauthorized页面,即使您已将401添加到web.config中的customersrors部分。我读到在使用IIS和Windows身份验证时检查发生在ASP.NET甚至看到请求之前,因此您在Cassini上看到空白页面,在IIS上看到它自己的401。
对于我的项目,我编辑了Global.asax文件,以重定向到我为401错误创建的路由,将用户发送到“Unauthorized to see this”视图。
在Global.asax中:
void Application_EndRequest(object sender, System.EventArgs e)
{
// If the user is not authorised to see this page or access this function, send them to the error page.
if (Response.StatusCode == 401)
{
Response.ClearContent();
Response.RedirectToRoute("ErrorHandler", (RouteTable.Routes["ErrorHandler"] as Route).Defaults);
}
}
并在Route.config中:
routes.MapRoute(
"ErrorHandler",
"Error/{action}/{errMsg}",
new { controller = "Error", action = "Unauthorised", errMsg = UrlParameter.Optional }
);
并在控制器中:
public ViewResult Unauthorised()
{
//Response.StatusCode = 401; // Do not set this or else you get a redirect loop
return View();
}
答案 1 :(得分:3)
从tvanfosson查看Answer的this very similar question,这就是我正在做的事(感谢tvanfosson),所以现在我只想说:
[MyAuthorize(Roles="SuperAdmin",ViewName="AccessDenied")]
public class SuperAdminController : Controller
...
如果用户不在角色中,他们将获得ViewName指定的视图。
注意:空白页面来自Cassini,如果您将应用程序移动到实际的IIS服务器,您将看到401。
答案 2 :(得分:1)
据我所知,标准方法是使用一个简单的错误控制器来处理传入的请求,并根据返回的httpstatus代码输出相应的视图......如下所示:
public class ErrorController : Controller
{
[AcceptVerbs(HttpVerbs.Get)]
public ViewResult Index()
{
//Check if the statuscode is HttpStatusCode.NotFound;
if(Response.StatusCode == 401)
return View("NotAuthorised");
return View();
}
}
然后在webconfig中指定重定向操作:
<customErrors mode="On" defaultRedirect="~/Error" />
答案 3 :(得分:0)
您还可以创建自己的自定义授权属性,并设置自己的路线以重定向页面上的用户。
这是我项目的示例:
/*../controllers/CustomAuthorizationAttribute.cs */
public class CustomAuthorizationAttribute : FilterAttribute, IAuthorizationFilter
{
void IAuthorizationFilter.OnAuthorization(AuthorizationContext filterContext)
{
string session = filterContext.HttpContext.Session["id"] != null ? filterContext.HttpContext.Session["id"].ToString() : null;
if ( string.IsNullOrEmpty(session) )
{
// Unauthorized!
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary
{
{ "action", "Create" }, { "controller", "Sessions" }
//,{ "parameterName", "YourParameterValue" }
}
);
}
}
}
然后在动作控制器中添加“标志”,如下所示
/*../controllers/ReportsController.cs */
public class ReportsController : Controller
{
[CustomAuthorizationAttribute]
public ActionResult Index()
{
//do something
}
}