asp.net 核心身份中的多个和子域的cookie



我有一个网页,它为同一个应用程序使用多个URL:

例如: *.MyWebPage.com.au *.YourWebPage.com.au

因此,它将在多个网址上使用子域。问题是我需要允许用户在他们登录的 url 的所有子域上进行身份验证。

例如,如果他们通过 www.mywebpage.com.au 登录,则需要将 cookie 设置为 *.mywebpage.com.au,或者如果他们通过 www.yourwebpage.com.au 登录,则 cookie 应为 *.yourwebpage.com.au。

大多数允许子域 ASP.NET 核心标识的文档都指向 startup.cs(或 startup.auth.cs)文件并输入如下内容:

app.UseCookieAuthentication(new CookieAuthenticationOptions()
{
CookieDomain = "mywebpage.com.au"
});`

这对我不起作用,因为我不想要固定域,我只想允许所有用户访问他们登录的 URL 的所有子域。 我显然可以在登录时通过请求获取他们的 URL,但此时我需要动态设置 cookiedomain。

当我开始的时候,我没有意识到身份和CookieAuthentication之间的区别。 因为我正在使用身份

app.UseIdentity();

.app。UseCookieAuthentication不是解决方案。

我终于通过实施ICookieManager找到了我的解决方案。

这是我的解决方案:

在启动.cs:

services.AddIdentity<ApplicationUser, IdentityRole>(options =>
{
options.Password.RequireDigit = false;
options.Password.RequiredLength = 5;
options.Password.RequireNonAlphanumeric = false;
options.Password.RequireLowercase = false;
options.Password.RequireUppercase = false;
options.Cookies.ApplicationCookie.CookieManager = new CookieManager(); //Magic happens here
}).AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();

现在在一个我称之为CookieManager的类中.cs:

public class CookieManager : ICookieManager
{
#region Private Members
private readonly ICookieManager ConcreteManager;
#endregion
#region Prvate Methods
private string RemoveSubdomain(string host)
{
var splitHostname = host.Split('.');
//if not localhost
if (splitHostname.Length > 1)
{
return string.Join(".", splitHostname.Skip(1));
}
else
{
return host;
}
}
#endregion
#region Public Methods
public CookieManager()
{
ConcreteManager = new ChunkingCookieManager();
}
public void AppendResponseCookie(HttpContext context, string key, string value, CookieOptions options)
{
options.Domain = RemoveSubdomain(context.Request.Host.Host);  //Set the Cookie Domain using the request from host
ConcreteManager.AppendResponseCookie(context, key, value, options);
}
public void DeleteCookie(HttpContext context, string key, CookieOptions options)
{
ConcreteManager.DeleteCookie(context, key, options);
}
public string GetRequestCookie(HttpContext context, string key)
{
return ConcreteManager.GetRequestCookie(context, key);
}
#endregion

除了@michael的解决方案:

  • ICookieICookie Interfacehttp cookie object之上的抽象层,用于保护data
  • ICookieManagerCookie ManagerICookie Interface之上的抽象层。这在<TSource>通用支持方面扩展了 Cookie 行为,Func<TResult>.这是由DefaultCookieManager类实现的。ICookie Interface是这个阶级的迂腐。
  • CookieManager的使用 :

    1. 在启动配置服务中添加CookieManager
    2. 访问 CookieManager API。
    3. 源代码可在Nemi Chand的git上找到。

有多少个主要域?如果不是太多,您可以添加几个 CookieAuthenticationOptions。喜欢这个:

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationScheme = "mywebpage.com.au",
CookieDomain = "mywebpage.com.au",
});
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationScheme = "yourwebpage.com.au",
CookieDomain = "yourwebpage.com.au",
});

如果主域太多,则需要编写自己的 cookie 提供程序。

@michael答案的补充: 如何"处理删除cookie事件,添加选项。域 = 删除子域(上下文。Request.Host.Host)": 只需添加

options.Domain= RemoveSubdomain(context.Request.Host.Host);

以前

ConcreteManager.DeleteCookie(context, key, options);

CookieManager.DeleteCoockie(..){..};

并且不要忘记在注销时致电CookieManager.DeleteCoockie!

PS 另外,如果您需要能够在 subdomain.example.com 和 example.com 上登录 - 您需要修改 AppendResponseCookie(..){..},否则您将在这里只得到TLD(.com/.ru等)

相关内容

  • 没有找到相关文章