控制器不加载.aspnetcore.Identity.Application用户cookie



我有一个简单的控制器,在用户登录后调用。我可以在我的身份服务器上看到用户已登录。我还可以看到.aspnetcore.Identity.Application.application.application.application.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.
    }
}

我找到了一项工作,迫使它加载cookie

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";
                });

注意:删除[允许词]使其根本无法工作,这可能是由于无法看到身份验证的事实。

使用Authorize属性时,它将使用使用AddAuthentication配置的默认AuthenticationScheme。在您的示例中,看起来像这样:

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)

因为这是 CookieAuthenticationDefaults.AuthenticationScheme(" cookies"),所以 Authorize属性在尝试签署用户时使用的。方法表明您实际上想使用 IdentityConstants.ApplicationScheme(" endentity.application")`而不是。

Authorize属性允许您使用AuthenticationSchemes属性指定要使用的AuthenticationScheme(S),该属性看起来像这样:

[Authorize(AuthenticationSchemes = "Identity.Application")]

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

我终于弄清楚了今天早上的问题。

services.AddAuthentication(options =>
                {
                    options.DefaultAuthenticateScheme = IdentityConstants.ApplicationScheme;
                    options.DefaultChallengeScheme = IdentityConstants.ApplicationScheme;
                })

需要设置DefaultAuthenticateScheme和DefaultChallenGescheme。然后[授权]独自工作

将其作为替代解决方案。

相关内容

最新更新