ASP.NET 核心 MVC ChallengeResult,重定向操作方法未收到 AuthenticationProperties 参数

ASP.NET Core MVC ChallengeResult, AuthenticationProperties argument is not received at the redirected action method

我有一个非常基本的身份验证设置:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
                .AddCookie();
    }
}

现在当返回 MVC ChallengeResult 时(带有 AuthenticationProperties 参数):

public class HomeController : Controller
{ 
    public IActionResult Index()
    {
        if (!User.Identity.IsAuthenticated)
        {
            return Challenge(new AuthenticationProperties
            {
                IsPersistent = true
            });
        }
        else
        {
            return View();    
        }
    }
}

请求被重定向到 /Account/Login 和以下操作方法:

问题:当执行到 Login() 操作方法时,Index() 操作方法中 IsPersistent = true 的原始赋值丢失。

应用内置于:.NET Core 3.1

操作login中的参数properties是一个新实例。它将始终为空。因为您没有为请求分配值。返回Challenge后,鉴权会发起重定向。但是重定向不会带这个参数。

您可以设置一个事件来保存会话中的 cookie 身份验证上下文的值。

public void ConfigureServices(IServiceCollection services)
    {
        services.AddAuthentication("auth")
            .AddCookie("auth",config=>
            {
                config.Cookie.Name = "cookie.name";

                config.Events.OnRedirectToLogin = context =>
                {
                    context.HttpContext.Session.SetString("Properties",System.Text.Json.JsonSerializer.Serialize(context.Properties));
                    context.Response.Redirect("/home/login");
                    return Task.CompletedTask;
                };
            });
        services.AddSession();
        services.AddControllersWithViews();
    }

正在行动login

public IActionResult login()
    {
        var get=HttpContext.Session.GetString("Properties");
        var deserializer = System.Text.Json.JsonSerializer.Deserialize<AuthenticationProperties>(get);
        return View();
    }

然后,属性将被传递到登录中。