C# 部分视图的HandleUnauthorizedRequest重定向并在页面底部添加新视图
这在标题中有点难以解释。基本上我有一个MVC应用程序,它有一个共享的视图。共享视图是标题,然后根据用户选择的选项卡加载视图 我的问题如下: 封闭视图有一个网格,用户可以单击该网格并从中获取详细信息。详细信息页面是一个局部视图。我正在尝试应用MVC安全过滤器,并在会话过期时重定向到登录页面。我有一个覆盖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.
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
}
);
}
}
}