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

时间:2017-12-13 12:15:10

标签: 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]/[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";
                });

注意:删除[AllowAnonymous]会导致它无法正常工作,因为它无法看到身份验证。

2 个答案:

答案 0 :(得分:5)

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

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)

由于这是CookieAuthenticationDefaults.AuthenticationScheme(“Cookie”),Authorize属性在尝试为用户签名时正在使用该属性。您的解决方法显示您确实想要使用IdentityConstants.ApplicationScheme( “Identity.Application”)`而不是。

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

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

事实证明你不能直接使用IdentityConstants.ApplicationScheme,因为这不是编译时常量。虽然您可以显式使用字符串值,但您可以通过设置策略来获得编译时安全性。有关如何执行此操作的示例,请参阅docs

答案 1 :(得分:1)

我今天早上终于找到了问题。

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

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

将此作为替代解决方案。