Asp.net mvc ASP.NET MVC使用自定义角色提供程序重定向到拒绝访问的页面
我正在创建一个自定义角色提供程序,并设置了一个Authorize属性,指定控制器中的角色,它工作正常,如下所示:Asp.net mvc ASP.NET MVC使用自定义角色提供程序重定向到拒绝访问的页面,asp.net-mvc,asp.net-membership,roleprovider,Asp.net Mvc,Asp.net Membership,Roleprovider,我正在创建一个自定义角色提供程序,并设置了一个Authorize属性,指定控制器中的角色,它工作正常,如下所示: [Authorize(Roles="SuperAdmin")] public class SuperAdminController : Controller ... 但当用户无法访问此控制器时,他将被重定向到登录页面。 我如何将他重定向到“AcessDenied.aspx”页面 AccessDeniedAuthorizeAttribute.cs: public class Acce
[Authorize(Roles="SuperAdmin")]
public class SuperAdminController : Controller
...
但当用户无法访问此控制器时,他将被重定向到登录页面。
我如何将他重定向到“AcessDenied.aspx”页面
AccessDeniedAuthorizeAttribute.cs:
public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
if(filterContext.Result is HttpUnauthorizedResult)
{
filterContext.Result = new RedirectResult("~/AcessDenied.aspx");
}
}
}
public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
filterContext.Result = new RedirectResult("~/Account/Logon");
return;
}
if (filterContext.Result is HttpUnauthorizedResult)
{
filterContext.Result = new RedirectResult("~/Account/Denied");
}
}
}
看一看,这就是我正在做的(多亏了tvanfosson),所以现在我只能说:
[MyAuthorize(Roles="SuperAdmin",ViewName="AccessDenied")]
public class SuperAdminController : Controller
...
如果用户不在该角色中,他们将获得由ViewName指定的W视图。这是我的解决方案,基于eu ge ne的回答。 如果用户未登录,则Mine会正确地将用户重定向到登录页面;如果用户已登录但未经授权查看该页面,则Mine会将用户重定向到拒绝访问页面 AccessDeniedAuthorizeAttribute.cs:
public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
if(filterContext.Result is HttpUnauthorizedResult)
{
filterContext.Result = new RedirectResult("~/AcessDenied.aspx");
}
}
}
public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
filterContext.Result = new RedirectResult("~/Account/Logon");
return;
}
if (filterContext.Result is HttpUnauthorizedResult)
{
filterContext.Result = new RedirectResult("~/Account/Denied");
}
}
}
AccountController.cs:
public ActionResult Denied()
{
return View();
}
Views/Account/Denied.cshtml:(Razor语法)
@{
ViewBag.Title=“访问被拒绝”;
}
@视图包。标题
抱歉,您没有访问该页面的权限。
对Matt的答案稍加改进,避免了硬编码登录页面的需要,并可选择在属性中设置“拒绝访问”视图:
公共类AccessDeniedAuthorizeAttribute:AuthorizeAttribute
{
公共字符串AccessDeniedViewName{get;set;}
授权时的公共覆盖无效(AuthorizationContext filterContext)
{
基于授权(filterContext);
如果(filterContext.HttpContext.User.Identity.IsAuthenticated&&
filterContext。结果为HttpUnauthorizedResult)
{
if(string.IsNullOrWhiteSpace(AccessDeniedViewName))
AccessDeniedViewName=“~/Account/AccessDenied”;
filterContext.Result=新的重定向结果(AccessDeniedViewName);
}
}
}
我在Vic的答案的基础上构建了一个不同的拒绝访问页面,用于每个应用程序区域。而是返回一个RedirectToRouteResult
,它不是重定向到相对于应用程序根目录的URL,而是重定向到当前区域的控制器和操作:
public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute
{
public string AccessDeniedController { get; set; }
public string AccessDeniedAction { get; set; }
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
if (filterContext.HttpContext.User.Identity.IsAuthenticated &&
filterContext.Result is HttpUnauthorizedResult)
{
if (String.IsNullOrWhiteSpace(AccessDeniedController) || String.IsNullOrWhiteSpace(AccessDeniedAction))
{
AccessDeniedController = "Home";
AccessDeniedAction = "AccessDenied";
}
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { Controller = AccessDeniedController, Action = AccessDeniedAction }));
}
}
}
只是Vic Alcazar的一个小更新, 在重定向中添加了请求url的详细信息 这样就可以记录被拒绝访问的详细信息,如果需要,还可以记录被拒绝访问的人的详细信息
public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute
{
public string AccessDeniedViewName { get; set; }
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
if (filterContext.HttpContext.User.Identity.IsAuthenticated &&
filterContext.Result is HttpUnauthorizedResult)
{
if (string.IsNullOrWhiteSpace(AccessDeniedViewName))
AccessDeniedViewName = "~/Account/AccessDenied";
var requestUrl = filterContext.HttpContext.Request.Url;
filterContext.Result = new RedirectResult(String.Format("{0}?RequestUrl={1}", AccessDeniedViewName, requestUrl));
}
}
}
重定向并不总是最好的解决方案 使用标准http代码403:
return new HttpStatusCodeResult(HttpStatusCode.Forbidden);
我也有类似的问题。无论我扮演什么角色,我总是被重定向到登录页面,而不是被拒绝访问。 修复起来难以置信的简单,但它可能并不适用于所有情况。结果是,我在Startup.cs这两行中的顺序是错误的:
app.UseAuthentication();
app.UseAuthorization();
确保app.UseAuthentication()是否正确;在app.UseAuthorization()之前
换句话说,先问“你是谁?”然后问“你在这里被允许吗?”,而不是相反。如果用户登录并试图访问该页面,他们将被重定向到AccessDenied页面。好。但是,如果用户未登录,他们将被重定向到AccessDenied页面。糟糕。在这种情况下,应该将它们重定向到登录页面。如果您希望在用户不在的情况下正常重定向页面,请在base.OnAuthorization()方法调用后,在其余代码周围添加一条If语句,以检查Threading.Thread.CurrentPrincipal.Identity.IsAuthentication是否已验证。这样,除非用户未经过身份验证,否则用户将被定向到AccessDenied页面……在这种情况下,它将执行默认操作(重定向到登录页面)该类放在哪里?在控制器中?工作正常,但我认为Frinavale point是好的和有效的。(y) MVC:AcessDenied.aspx?不是cshtml?任何
访问的移动或表格属性
?
return new HttpStatusCodeResult(HttpStatusCode.Forbidden);
app.UseAuthentication();
app.UseAuthorization();