Asp.Net Identity - 在运行时设置CookieDomain

时间:2014-04-10 13:47:11

标签: asp.net authentication claims-based-identity

如果我想从Request.Url或从我的数据库中存储的某些设置中提取此值,如何在运行时在CookieAuthenticationOptions中设置CookieDOmain?

我想支持子域,但也支持多租户,每个租户都有不同的域。

目前已配置此功能,我无权访问其中任何一项。

3 个答案:

答案 0 :(得分:12)

您可以指定自己的Cookie提供商:

CookieAuthProvider myProvider = new CookieAuthProvider();
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
   AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
   LoginPath = new PathString("/Account/Login"),
   Provider = myProvider
});

要么实现自己的,要么只是继承现有的提供者:

public class CookieAuthProvider : CookieAuthenticationProvider
{
    public override void ResponseSignIn(CookieResponseSignInContext context)
    {
      //Alter you cookie options
      //context.CookieOptions.Domain  =  "www...";      
      base.ResponseSignIn(context);
    }
 }

并实现ResponseSignIn,当端点在将信息转换为cookie之前提供了登录信息时,会调用它。通过实施此方法,可能会更改进入故障单的索赔和额外信息。

您将被传递CookieResponseSignInContext,这会泄露CookieOptionsResponseSignIn来电期间可以替换或更改的{{1}}属性。

Katana项目的代码参考:

答案 1 :(得分:3)

你们已经尝试过这个:

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
  AuthenticationType = "Application",
  LoginPath = "/Account/Login",
  CookieDomain = ".myDomain.com"
});

答案 2 :(得分:2)

使用SlidingExpiration选项时,MK. answer似乎无法正确处理令牌续订。

作为一种解决方法,您可以提供自定义Cookie管理器,并定义自己添加/删除Cookie的方法,而不是提供自定义Cookie提供程序。

为了保持简单,我会重复使用默认的cookie管理器。 (我不能扩展它,它的方法不可覆盖。)

以下是我最终得到的代码:

using Microsoft.AspNet.Identity;
using Microsoft.Owin;
using Microsoft.Owin.Infrastructure;
using Microsoft.Owin.Security.Cookies;
using Microsoft.Owin.Security.DataProtection;
using Owin;

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        var options = new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            SlidingExpiration = true,
            CookieManager = new CustomCookieManager()
        };

        app.UseCookieAuthentication(options);
    }
}

public class CustomCookieManager : ICookieManager
{
    private readonly ICookieManager ConcreteManager;

    public CustomCookieManager()
    {
        ConcreteManager = new ChunkingCookieManager();
    }

    string ICookieManager.GetRequestCookie(IOwinContext context, string key)
    {
        return ConcreteManager.GetRequestCookie(context, key);
    }

    void ICookieManager.AppendResponseCookie(IOwinContext context, string key, string value, CookieOptions options)
    {
        SetupDomain(context, options);
        ConcreteManager.AppendResponseCookie(context, key, value, options);
    }

    void ICookieManager.DeleteCookie(IOwinContext context, string key, CookieOptions options)
    {
        SetupDomain(context, options);
        ConcreteManager.DeleteCookie(context, key, options);
    }

    private void SetupDomain(IOwinContext context, CookieOptions options)
    {
        // custom logic for assigning something to options.Domain
    }
}