Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重定向到来自服务器的非正交响应的登录页面_C#_.net_Asp.net Core - Fatal编程技术网

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,因为客户端不使用任何身份验证。我需要在这里以某种方式获取服务器的响应以进行检查。