Asp.net mvc ASP.NET MVC使用自定义角色提供程序重定向到拒绝访问的页面

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属性,指定控制器中的角色,它工作正常,如下所示:

[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();