C# 控制器未加载.AspNetCore.Identity.Application用户cookie

C# 控制器未加载.AspNetCore.Identity.Application用户cookie,c#,asp.net,asp.net-core,asp.net-core-mvc,.net-core,C#,Asp.net,Asp.net Core,Asp.net Core Mvc,.net Core,我有一个简单的控制器,在用户登录后调用。我可以在标识服务器上看到用户已登录。我还可以看到在浏览器中设置了.AspNetCore.Identity.Application cookie 登录后,用户将使用转发到此控制器 RedirectToAction(nameof(Index), "Manage") 问题是控制器似乎没有经过身份验证。我尝试了HttpContext.User和其他我认为控制器没有读取cookie的东西 [Authorize] [Route("[controller]/[acti

我有一个简单的控制器,在用户登录后调用。我可以在标识服务器上看到用户已登录。我还可以看到在浏览器中设置了.AspNetCore.Identity.Application cookie

登录后,用户将使用转发到此控制器

RedirectToAction(nameof(Index), "Manage")
问题是控制器似乎没有经过身份验证。我尝试了HttpContext.User和其他我认为控制器没有读取cookie的东西

[Authorize]
[Route("[controller]/[action]")]
public class ManageController : Controller
{

    [HttpGet]
    [AllowAnonymous]
    public async Task<IActionResult> Index(ManageMessageId? message = null)
    {

      //  try to find user here.
    }
}
var loadTheStupidCookie = await HttpContext.AuthenticateAsync(IdentityConstants.ApplicationScheme);
var user = await _userManager.GetUserAsync(loadTheStupidCookie.Principal);
这是可行的,但我认为在控制器中的每个方法中都必须加载它,这是过分的。控制器不能为我加载cookie吗

从startup.cs

 services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
                .AddCookie(options =>
                {
                    options.LoginPath = new PathString("/Account/Login");
                    options.AccessDeniedPath = new PathString("/Account/Forbidden/");
                })
                .AddGoogle("Google", options =>
                {
                    options.AccessType = "offline";
                    options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;
                    options.ClientId = "xxxxx.apps.googleusercontent.com";
                    options.ClientSecret = "XXXX";
                });
注意:删除[AllowAnonymous]会导致它完全不工作,可能是因为它看不到身份验证。

当您使用Authorize属性时,它将使用使用AddAuthentication配置的默认身份验证方案。在您的示例中,如下所示:

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
[Authorize(AuthenticationSchemes = "Identity.Application")]
因为这是Cookies,所以Authorize属性在尝试登录用户时使用它。您的解决方案表明您实际上想要使用Identity.Application`来代替

Authorize属性允许您使用AuthenticationSchemes属性指定要使用的AuthenticationSchemes,如下所示:

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
[Authorize(AuthenticationSchemes = "Identity.Application")]
事实证明,您不能直接使用IdentityConstants.ApplicationScheme,因为这不是编译时常量。尽管可以显式地使用字符串值,但是可以通过设置策略来获得编译时安全性,例如。有关如何执行此操作的示例,请参见。

当您使用Authorize属性时,它将使用使用AddAuthentication配置的默认AuthenticationScheme。在您的示例中,如下所示:

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
[Authorize(AuthenticationSchemes = "Identity.Application")]
因为这是Cookies,所以Authorize属性在尝试登录用户时使用它。您的解决方案表明您实际上想要使用Identity.Application`来代替

Authorize属性允许您使用AuthenticationSchemes属性指定要使用的AuthenticationSchemes,如下所示:

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
[Authorize(AuthenticationSchemes = "Identity.Application")]

事实证明,您不能直接使用IdentityConstants.ApplicationScheme,因为这不是编译时常量。尽管可以显式地使用字符串值,但是可以通过设置策略来获得编译时安全性,例如。有关如何实现这一点的示例,请参见。

今天早上我终于解决了这个问题

services.AddAuthentication(options =>
                {
                    options.DefaultAuthenticateScheme = IdentityConstants.ApplicationScheme;
                    options.DefaultChallengeScheme = IdentityConstants.ApplicationScheme;
                })
需要设置DefaultAuthenticateScheme和DefaultChallengeScheme。那么[授权]单独起作用


将此作为替代解决方案。

今天早上我终于解决了这个问题

services.AddAuthentication(options =>
                {
                    options.DefaultAuthenticateScheme = IdentityConstants.ApplicationScheme;
                    options.DefaultChallengeScheme = IdentityConstants.ApplicationScheme;
                })
需要设置DefaultAuthenticateScheme和DefaultChallengeScheme。那么[授权]单独起作用


将此作为备用解决方案。

启动时,中间件配置中是否有app.UseAuthentication?@juunas是,配置中有。在使用MVC之前,我假设:请尝试[AuthorizationAuthenticationSchemes=IdentityConstants.ApplicationScheme],而不仅仅是[Authorization]。@serpent5[AuthorizationAuthenticationSchemes=IdentityConstants.ApplicationScheme]表示属性参数必须是属性参数类型的常量表达式或数组创建表达式。在启动时的中间件配置中是否有app.UseAuthentication?@juunas是在其配置中。在使用MVC之前,我假设?:请尝试[AuthorizationAuthenticationSchemes=IdentityConstants.ApplicationScheme],而不仅仅是[Authorization]。@serpent5[AuthorizationAuthenticationSchemes=IdentityConstants.ApplicationScheme]表示属性参数必须是属性参数类型的常量表达式或数组创建表达式。那么,设置cookie是否有问题?或者这样做可以吗?你所做的没有本质上的错误-使用多个身份验证方案并像这样区分它们是完全可以的。真正的问题是你是否需要两个方案,但这不是我能为你的具体项目回答的问题。不幸的是,这并没有完全解决问题,所以我打开了另一个与此相关的问题。为什么Identity.Application不是常量,而是在IdentityConstants中只读。ApplicationScheme@Novikov我不确定,但我想知道这是否是因为readonly允许在新版本中更改值,并允许使用自动使用该新值。如果它是常量,那么改变它将是一个突破性的改变。这似乎不是一个有力的论据,但这是const和readonly之间的一个重要区别。好吧,那么我在设置cookie时是否做错了什么?或者这样做可以吗?你所做的没有本质上的错误-使用多个身份验证方案并像这样区分它们是完全可以的。真正的问题是你是否需要两种方案,但这不是一些
我能为你的具体项目回答的问题。不幸的是,这并没有完全解决问题,所以我打开了另一个与之相关的问题。为什么Identity.Application不是常量,而是在IdentityConstants中只读。ApplicationScheme@Novikov我不确定,但我想知道这是否是因为readonly允许在新版本中更改值,并允许使用自动使用该新值。如果它是常量,那么改变它将是一个突破性的改变。这似乎不是一个有力的论点,但这是const和readonly之间的一个重要区别。