C# 部分视图的HandleUnauthorizedRequest重定向并在页面底部添加新视图

C# 部分视图的HandleUnauthorizedRequest重定向并在页面底部添加新视图,c#,asp.net-mvc,asp.net-mvc-partialview,authorize-attribute,asp.net-mvc-filters,C#,Asp.net Mvc,Asp.net Mvc Partialview,Authorize Attribute,Asp.net Mvc Filters,这在标题中有点难以解释。基本上我有一个MVC应用程序,它有一个共享的视图。共享视图是标题,然后根据用户选择的选项卡加载视图 我的问题如下: 封闭视图有一个网格,用户可以单击该网格并从中获取详细信息。详细信息页面是一个局部视图。我正在尝试应用MVC安全过滤器,并在会话过期时重定向到登录页面。我有一个覆盖HandleUnauthorizedRequest的自定义类 using System; using System.Linq; using System.Web; using System.Web.

这在标题中有点难以解释。基本上我有一个MVC应用程序,它有一个共享的视图。共享视图是标题,然后根据用户选择的选项卡加载视图

我的问题如下:

封闭视图有一个网格,用户可以单击该网格并从中获取详细信息。详细信息页面是一个局部视图。我正在尝试应用MVC安全过滤器,并在会话过期时重定向到登录页面。我有一个覆盖HandleUnauthorizedRequest的自定义类

using System;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using System.Web.Security;
using PortalAPI.SPModels;
using SICommon.Enums;
using SICommon.LoggingOperations;

namespace Portal.Security {
    public class AuthorizedUser : AuthorizeAttribute {
        public bool IsAuthorized { get; set; }

        protected override bool AuthorizeCore(HttpContextBase httpContext) {
            var sessionHash = Convert.FromBase64String(httpContext.Request.Cookies.Get("hash")?.Value);

            if (sessionHash == null)
                return this.IsAuthorized = false;

            if (TransmitToSP.TransmitAPIRequest<APIRequest, SICommon.CommonModels.APIResponse>(
                new APIRequest() {
                    UserRole = (UserRole)((CustomPrincipal)httpContext.User)?.CustomIdentity?.UserRoles[0],
                    SessionHash = sessionHash,
                    RequestStartTime = DateTime.UtcNow,
                    CallerMethod = "AuthorizeCore"
                }, "ValidateSession").ErrorCode == 24) {

                if (httpContext.Request.Cookies.AllKeys.Contains("hash")) {
                    FormsAuthentication.SignOut();
                    HttpContext.Current.Request.Cookies.Remove("hash");
                    return this.IsAuthorized = false;
                }
            }
            return this.IsAuthorized = true;
        }

        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) {
            filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary(
                    new {
                        controller = "Account",
                        action = "Login"
                    }
                )
            );
            base.HandleUnauthorizedRequest(filterContext);
        }
    }
}

重定向将在局部视图下加载。尝试修复此问题,使其仅加载到主视图


我注意到视图正在嵌入到主视图中。正在页眉和页脚之间插入重定向

您如何将此部分内容包含在您的视图中?通过AJAX或
Html.Action
?@Html.ActionLink(searchName,“Index”,“Requests”,routevalue,HTMLAttributes),这并不能真正回答我的问题。当用户单击此链接时,您是否使用AJAX发出请求?哦,是的,我使用的是AJAX调用。在重定向到登录页面时,您无法以与普通web请求相同的方式处理AJAX请求。我建议您在
filterContext.HttpContext.Request.IsAjaxRequest()
上的属性中进行分支,并返回401,而不是重定向。然后,在错误AJAX回调中,您可以检查401状态代码,并以更合适的方式处理身份验证失败?通过AJAX或
Html.Action
?@Html.ActionLink(searchName,“Index”,“Requests”,routevalue,HTMLAttributes),这并不能真正回答我的问题。当用户单击此链接时,您是否使用AJAX发出请求?哦,是的,我使用的是AJAX调用。在重定向到登录页面时,您无法以与普通web请求相同的方式处理AJAX请求。我建议您在
filterContext.HttpContext.Request.IsAjaxRequest()
上的属性中进行分支,并返回401,而不是重定向。然后,在错误AJAX回调中,可以检查401状态代码,并以更合适的方式处理身份验证失败。
namespace Portal.Controllers {
    [AuthorizedUser(IsAuthorized = true)]
    public class RequestsController : Controller {

       public PartialViewResult GetDetails(){
         return PartialView("_DetailsPartial", 
                 new DetailsModel {
                       RequestToDisplay = requestToDisplay
                 }
                );
       }
     }
  }