C# 重定向到来自服务器的非正交响应的登录页面
我在中间件中使用以下代码:C# 重定向到来自服务器的非正交响应的登录页面,c#,.net,asp.net-core,C#,.net,Asp.net Core,我在中间件中使用以下代码: app.UseStatusCodePages(context => { var response = context.HttpContext.Response; if (response.StatusCode == (int)HttpStatusCode.Unauthorized || response.StatusCode == (
app.UseStatusCodePages(context =>
{
var response = context.HttpContext.Response;
if (response.StatusCode == (int)HttpStatusCode.Unauthorized ||
response.StatusCode == (int)HttpStatusCode.Forbidden)
response.Redirect("/SampleController/LoginUserAction");
return Task.CompletedTask;
});
但是,它只在客户端使用身份验证时起作用,但这不是必需的,因为我已经在服务器上处理了所有的自动授权。当从服务器收到401或403时,我只想将任何操作重定向到登录页面,如下所示:
if ((int)result.StatusCode == 401 || (int)result.StatusCode == 403)
return RedirectToAction("LoginUserAction", "SampleController");
但我不想重复地从接收到响应的每个控制器操作调用它。我想在Startup中编写一个代码,在收到未经授权的响应时自动调用,类似于上面编写的代码
非常感谢您的帮助。您可以在中设置登录路径 因此,未经授权的请求将重定向到登录页面
services.ConfigureApplicationCookie(options =>
{
options.AccessDeniedPath = "/Identity/Account/AccessDenied";
options.Cookie.Name = "YourAppCookieName";
options.Cookie.HttpOnly = true;
options.ExpireTimeSpan = TimeSpan.FromMinutes(60);
options.LoginPath = "/Identity/Account/Login";
// ReturnUrlParameter requires
//using Microsoft.AspNetCore.Authentication.Cookies;
options.ReturnUrlParameter = CookieAuthenticationDefaults.ReturnUrlParameter;
options.SlidingExpiration = true;
});
根据文档,在调用AddIdentity或AddDefaultIdentity后,必须调用ConfigureApplicationOkie。您可以在中设置登录路径 因此,未经授权的请求将重定向到登录页面
services.ConfigureApplicationCookie(options =>
{
options.AccessDeniedPath = "/Identity/Account/AccessDenied";
options.Cookie.Name = "YourAppCookieName";
options.Cookie.HttpOnly = true;
options.ExpireTimeSpan = TimeSpan.FromMinutes(60);
options.LoginPath = "/Identity/Account/Login";
// ReturnUrlParameter requires
//using Microsoft.AspNetCore.Authentication.Cookies;
options.ReturnUrlParameter = CookieAuthenticationDefaults.ReturnUrlParameter;
options.SlidingExpiration = true;
});
根据文档,在调用AddIdentity或AddDefaultIdentity之后,必须调用ConfigureApplicationOkie。您可以创建一个基本控制器,其他控制器从中继承,然后覆盖
OnActionExecuted
方法,以检查状态代码,并在必要时重定向,如:
public class BaseController : Controller
{
protected override void OnActionExecuted(ActionExecutedContext context)
{
if(context.HttpContext.Response.StatusCode == 403)
{
context.Result = new RedirectToRouteResult(new RouteValueDictionary(new
{
controller = "Sample",
action = "LoginUserAction"
}));
}
}
}
所有其他应共享此行为的控制器将继承自BaseController
,如下所示:
public class SampleController : BaseController
{
//more here
}
您可以创建一个基本控制器,其他控制器从中继承,然后覆盖
OnActionExecuted
方法以检查状态代码,并在必要时重定向,如:
public class BaseController : Controller
{
protected override void OnActionExecuted(ActionExecutedContext context)
{
if(context.HttpContext.Response.StatusCode == 403)
{
context.Result = new RedirectToRouteResult(new RouteValueDictionary(new
{
controller = "Sample",
action = "LoginUserAction"
}));
}
}
}
所有其他应共享此行为的控制器将继承自BaseController
,如下所示:
public class SampleController : BaseController
{
//more here
}
我喜欢这个解决方案,但是,这里的状态代码永远不会是403或401,因为客户端不使用任何身份验证。我需要在这里检查服务器的响应。我喜欢这个解决方案,但是,这里的状态代码永远不会是403或401,因为客户端不使用任何身份验证。我需要在这里以某种方式获取服务器的响应以进行检查。