0

我有一个带有 Windows 身份验证的 Intranet 应用程序设置。与大多数应用程序一样,应用程序的某些部分只能由特定角色访问。当不具有所需角色的用户尝试访问该区域时,应向他显示友好的“您无权查看此页面”视图。我搜索并查看了一些指导扩展授权属性的资源。我尝试了这种方法,但它根本不起作用。我仍然收到 IIS 错误消息,并且此自定义属性中的断点永远不会被命中。即使角色中的用户访问该页面,我的扩展属性中的断点也不会被命中。所以,我想知道我是否遗漏了什么?这就是我所拥有的——

    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class AuthorizeRedirect : AuthorizeAttribute
{

    private const string IS_AUTHORIZED = "isAuthorized";
    public string RedirectUrl = "~Areas/Errors/Http401";


    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        bool isAuthorized =  base.AuthorizeCore(httpContext);
        httpContext.Items.Add(IS_AUTHORIZED, isAuthorized);
        return isAuthorized;
    }

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);

        var isAuthorized = filterContext.HttpContext.Items[IS_AUTHORIZED] != null ? Convert.ToBoolean(filterContext.HttpContext.Items[IS_AUTHORIZED]) : false;

        if(!isAuthorized && filterContext.RequestContext.HttpContext.User.Identity.IsAuthenticated)
        {
        filterContext.RequestContext.HttpContext.Response.Redirect(RedirectUrl);
        }

    }
}

控制器 -

    [AuthorizeRedirect]
    [HttpPost, ValidateInput(true)]
    public  ActionResult NewPart(PartsViewModel vmodel) {..}

有任何想法吗?

谢谢

4

1 回答 1

0

我认为您可以改用自定义错误页面。用于AuthorizeAttribute限制调用者对操作方法的访问。

[Authorize (Roles="Editor, Moderator", Users="Ann, Gohn")]
public ActionResult RestrictedAction()
{
    // action logic
}

然后您可以使用@Marco 提出的其中一种方式。我喜欢在Application_EndRequest. 因此,可以通过以下方式解决您的问题:

protected void Application_EndRequest()
{
    int status = Response.StatusCode;
    if (Response.StatusCode == 401)
    {
        Response.Clear();
        var rd = new RouteData();
        rd.DataTokens["area"] = "Areas";
        rd.Values["controller"] = "Errors";
        rd.Values["action"] = "Http401";
        IController c = new ErrorsController();
        c.Execute(new RequestContext(new HttpContextWrapper(Context), rd));
    }
}

为了清楚地指定当 HTTP 状态代码错误时现有响应会发生什么,您应该在配置文件中使用元素的existingResponse属性。<httpErrors>如果您想立即出现错误页面,则使用Replacevalue,否则 - PassThrough(请参阅我的问题中的详细信息)。

于 2018-07-20T05:27:43.083 回答