0

在 ASP.NET Core 6 MVC 中,多租户应用程序租户具有不同的路径基础,例如/tenant1/tenant2.

HttpContext PathBase来自请求 url 的中间件集。

SignInAsync方法始终将身份验证 cookie 路径设置为根路径/

我正在尝试PathBase使用此代码段设置身份验证 cookie 路径:

Path = Request.PathBase.HasValue ? Request.PathBase.Value : "/"

下面显示的代码会引发编译时错误,因为AuthenticationProperties没有Path属性。如何设置 cookiePath属性,以便不同的用户可以使用不同的基本路径进行身份验证?

public class AccountController : Controller 
{
    public async Task<IActionResult> LogOn(string user, string password)
    {
        if (password != "secret")
            throw new ApplicationException("Bad password");

        var claims = new List<Claim> { new Claim(ClaimTypes.Name, user) };
        var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
    
        var authProperties = new AuthenticationProperties 
                                 {
                                     IsPersistent = true,
                                     AllowRefresh = true,
                                     // TODO: this throws compile error since Path property does not exist
                                     Path = Request.PathBase.HasValue ? Request.PathBase.Value : "/"
                                 };
    
        await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(claimsIdentity), authProperties);
    }
}
4

1 回答 1

1

您应该能够通过编写自己的ICookieManager并在添加 cookie 身份验证方案时设置它来实现这一点。 ICookieManager方法HttpContext作为输入,因此您可以PathBase从那里访问。

builder.Services.AddAuthentication()
    .AddCookie("Cookie", options =>
{
    options.CookieManager = CustomCookieManager();
});

这是 ICookieManager 的默认实现:ChunkingCookieManager

于 2022-01-01T15:11:09.367 回答