AspNetCore 同时使用 cookie 和持有者,并使 Authorize 属性默认同时使用两者



我有使用Cookie和持有者令牌的应用程序。由于我不想通过提供架构来更新每个授权,因此我确实重写了默认架构:

   services
            .AddAuthorization(options =>
                {
                    options.DefaultPolicy = new AuthorizationPolicyBuilder()
                        .AddAuthenticationSchemes(OAuthValidationDefaults.AuthenticationScheme,
                            CookieAuthenticationDefaults.AuthenticationScheme,
                            "Identity.Application")
                        .RequireAuthenticatedUser()
                        .Build();
                });
            services.AddAuthentication()
                .AddExternalAuthProviders(Configuration)
                .AddFlymarkOpenIdConnectServer()
                .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
                {
                    options.LoginPath = "/Identity/Account/LogIn";
                    options.SlidingExpiration = true;
                    options.Events.OnRedirectToLogin = OnRedirectToLogin;
                })
                .AddOAuthValidation(OAuthValidationDefaults.AuthenticationScheme,
                    o=>o.Events.OnCreateTicket = OnCreateTicket);
            services.ConfigureApplicationCookie(config =>
            {
                config.Events = new CookieAuthenticationEvents
                {
                    OnRedirectToLogin = OnRedirectToLogin
                };
            });

我认为如果我添加 CookieAuthenticationDefaults.AuthenticationScheme,那么它将起作用,但在我添加 Identity.Application 之前 cookie 不起作用

所以我的问题是为什么它不起作用或在哪里使用常量而不是硬编码字符串

ASP.NET 核心

身份使用自己的cookie身份验证处理程序实例,当您调用services.AddIdentity()时,该处理程序会神奇地为您注册。

如您所了解,这些实例不使用默认方案名称,而是使用以Identity.前缀开头的名称。

在您的代码中,您基本上是使用默认方案名称注册一个新的 cookie 处理程序实例。但是由于代码中没有任何内容使用它来发布cookie,因此它无法验证任何内容,并且始终会返回未经身份验证的票证,这就是为什么它不起作用的原因,直到您添加神奇的Identity.Application,它对应于 ASP.NET 核心身份使用的主要cookie处理程序实例。

您正在寻找的常数在 IdentityConstants .

注意:在添加同时接受身份验证 Cookie 和持有者令牌的默认策略之前,请格外小心,因为如果您的应用不使用防伪(开发 API 时通常就是这种情况),则它可能容易受到 CSRF 的攻击。

最新更新