gpt4 book ai didi

c# - 自定义 OWIN CookieAuthenticationProvider 在第一次/冷启动时失败

转载 作者:可可西里 更新时间:2023-11-01 09:14:18 25 4
gpt4 key购买 nike

我们有一个自定义 cookie 身份验证提供程序,它将设置身份验证 cookie 以承载主机名,如 .domain.com 而不是 domain.commy。域名.com。我们这样做是为了让 cookie 在所有子域和域中工作。就像下图一样简单。

问题

在应用冷启动后的第一次尝试中,cookie 仍然包含域 my.domain.com(我们的登录名是 my.domain.com)尽管如此在执行下面的 SubdomainCookieAuthentication 代码后将其设置为 .domain.com(使用断点检查)。在随后的登录尝试中,cookie 主机名没问题。

问题

我怎样才能解决这个问题,即使在第一次尝试时它也能正常工作?

代码

自定义 cookie 验证

public class SubdomainCookieAuthentication : CookieAuthenticationProvider
{
public override void ResponseSignIn(CookieResponseSignInContext context)
{
// We need to add a "." in front of the domain name to
// allow the cookie to be used on all sub-domains too
var hostname = context.Request.Uri.Host;
// works for www.google.com => google.com
// will FAIL for www.google.co.uk (gives co.uk) but doesn't apply to us
var dotTrimmedHostname = Regex.Replace(hostname, @"^.*(\.\S+\.\S+)", "$1");
context.Options.CookieDomain = dotTrimmedHostname;
base.ResponseSignIn(context);
}
}

在Owin启动类内部初始化如下

类:启动

文件:App_start\Startup.Auth.cs

public void ConfigureAuth(IAppBuilder app) 
{
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
Provider = new SubdomainCookieAuthentication()
});
}

最佳答案

我在第一次尝试使用 ResponseSignIn 方法时未设置 Cookie 域时遇到了同样的问题。我能够通过将 Owin 库更新到 3.x 并使用新的 CookieManager 设置域来解决这个问题。从这篇文章中找到了这个解决方案:

How is Owin able to set the Asp.Net Identity authentication cookies after the Application_EndRequest stage?

public class ChunkingCookieManagerWithSubdomains : ICookieManager
{
private readonly ChunkingCookieManager _chunkingCookieManager;

public ChunkingCookieManagerWithSubdomains()
{
_chunkingCookieManager = new ChunkingCookieManager();
}

public string GetRequestCookie(IOwinContext context, string key)
{
return _chunkingCookieManager.GetRequestCookie(context, key);
}

public void AppendResponseCookie(IOwinContext context, string key, string value, CookieOptions options)
{
options.Domain = context.Request.Uri.GetHostWithoutSubDomain();
_chunkingCookieManager.AppendResponseCookie(context, key, value, options);
}

public void DeleteCookie(IOwinContext context, string key, CookieOptions options)
{
options.Domain = context.Request.Uri.GetHostWithoutSubDomain();
_chunkingCookieManager.DeleteCookie(context, key, options);
}
}

public static class UriExtensions
{
public static string GetHostWithoutSubDomain(this Uri url)
{
if (url.HostNameType == UriHostNameType.Dns)
{
string host = url.Host;
if (host.Split('.').Length > 2)
{
int lastIndex = host.LastIndexOf(".");
int index = host.LastIndexOf(".", lastIndex - 1);
return host.Substring(index + 1);
}
else
{
return host;
}
}

return null;
}
}

然后,在Startup.Auth.cs中注册

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
...
CookieManager = new ChunkingCookieManagerWithSubdomains(),
...
}
);

关于c# - 自定义 OWIN CookieAuthenticationProvider 在第一次/冷启动时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23549802/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com