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

Pau*_*ett 7 asp.net authentication claims-based-identity

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

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

在配置此时我无法访问其中任何一个.

保罗

MK.*_*MK. 12

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

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

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

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

并且实现ResponseSignIn,当端点在将信息转换为cookie之前提供了登录信息时,会调用它.通过实施该方法,可以改变进入票证的权利要求和额外信息.

您将被传递给CookieResponseSignInContext,这会暴露CookieOptionsResponseSignIn通话期间可以替换或更改的属性.

Katana项目的代码参考:

  • 而且您还必须覆盖 ResponseSignOut,否则您可能无法退出...正如@MattJenkins 评论所述,但他打错了字并写了“In”而不是“Out”。 (3认同)
  • 难道网被我骗了。如果您没有找到 `CookieOptions` 属性,而是找到了一个 `Options` 属性,请不要尝试使用它,因为您认为这个答案有错别字。事实并非如此。如果缺少 `CookieOptions` 属性,则必须更新 Microsoft.Owin.Security.Cookies 引用。直接更改`Options` 属性会导致错误,因为它会更改后续请求的管理器选项,但不会更改当前请求!`CookieOptions` 属性的更改适用于当前请求,并且仅适用于它。 (2认同)

jom*_*k1e 6

你是否已经尝试过这个:

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

  • 似乎 OP 想要动态地执行此操作,而不是使用预先知道的固定值/不需要开发人员更改以部署到新域上。 (2认同)

Fré*_*ric 5

看起来像MK。答案不允许在使用SlidingExpiration选项时正确处理令牌更新。

作为解决方法,您似乎可以提供自定义 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
    }
}
Run Code Online (Sandbox Code Playgroud)