如何在Startup.cs

时间:2016-10-13 11:48:19

标签: asp.net-core asp.net-core-mvc

我的域名下面有多个网站。

在我的Startup.cs我有以下代码

public void ConfigureServices(IServiceCollection services)
{
    services.AddIdentity<ApplicationUser, ApplicationRole>(options =>
    {
        options.Cookies.ApplicationCookie.CookieName = "MyAppName";
        options.Cookies.ApplicationCookie.ExpireTimeSpanTimeSpan.FromMinutes(300);
     })
     .AddEntityFrameworkStores<MyDbContext, Guid>()
     .AddDefaultTokenProviders();

在生产机器上,我的所有网站都位于IIS中同一网站下的子文件夹中,因此我不想使用默认域名作为Cookie名称,否则不同的网站Cookie将具有相同的名称

我想要的是获取当前域名e..g mydomain.com,然后将其附加到我在Startup.cs中指定的每个网站的显式cookiename,例如

 var domain = "get the server domain here somehow e.g. domain.com";
 ...
 options.Cookies.ApplicationCookie.CookieName = "MyAppName." + domain;

我该怎么做?

我问的原因是:

我可以在Chrome开发者工具中看到,Cookie属于我访问的网站的单独域名。但是,当我在两个不同的服务器上登录同一站点时,我有时会得到这种情况,我无法登录到一个并且它不会记录任何错误。唯一的解决方案是使用另一个浏览器,所以我只能假设症状只能与cookie有关。

所以我的问题实际上只是个人偏好问题,因为在我的环境中我更愿意将域名附加到cookie名称,尽管cookie只能属于特定域。

1 个答案:

答案 0 :(得分:1)

首先,我会在配置中存储域名。因此,它可以让我根据当前环境进行更改。

options.Cookies.ApplicationCookie.CookieName = Configuration["DomainName"];

如果你不喜欢这种方式,你可以在这样的登录事件上覆盖cookie选项(我不确定下面的方法是好的):

Events = new CookieAuthenticationEvents()
{
   OnSigningIn = async (context) =>
   {
       context.Options.CookieName = "MyAppName." + context.HttpContext.Request.Host.Value.ToString();
   }
}

或者在配置和覆盖选项中捕获第一个请求

        bool firstRequest = true;
        app.Use(async (context, next) =>
        {
            if(firstRequest)
            {
                options.CookieName = "MyAppName." + context.HttpContext.Request.Host.Value.ToString();
                firstRequest = false;
            }
            await next();
        });

另见类似问题How to get base url without accessing a request