学向勤中得,萤窗万卷书。这篇文章主要讲述控制器未加载.AspNetCore.Identity.Application用户cookie相关的知识,希望能为你提供帮助。
我有一个简单的控制器,在用户登录后调用。我可以在我的身份服务器上看到用户已登录。我还可以看到.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]会导致它无法正常工作,因为它无法看到身份验证。
答案当您使用
Authorize
属性时,它将使用使用AuthenticationScheme
配置的默认AddAuthentication
。在您的示例中,看起来像这样:services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
因为这是
CookieAuthenticationDefaults.AuthenticationScheme
(“Cookies”),Authorize
属性在尝试签署用户时使用它。您的解决方法显示您实际上想要使用IdentityConstants.ApplicationScheme
(“Identity.Application”)`。Authorize
属性允许您使用AuthenticationScheme
属性指定要使用的AuthenticationSchemes
,如下所示:[Authorize(AuthenticationSchemes = "Identity.Application")]
事实证明你不能直接使用
IdentityConstants.ApplicationScheme
,因为这不是编译时常量。虽然您可以显式使用字符串值,但您可以通过设置策略来获得编译时安全性。有关如何执行此操作的示例,请参阅docs。另一答案我终于在今天早上发现了问题。
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = IdentityConstants.ApplicationScheme;
options.DefaultChallengeScheme = IdentityConstants.ApplicationScheme;
})
需要设置DefaultAuthenticateScheme和DefaultChallengeScheme。然后[授权]单独工作
【控制器未加载.AspNetCore.Identity.Application用户cookie】将此作为替代解决方案。
推荐阅读
- app.shared.module.ts和app.server.module.ts之间的差异
- ApplicationUser在Asp.Net Core 2.0中的ActionFilter中()
- org.hibernate.MappingException(未知实体:com.app.persistence.Test)
- 修改/删除现有的inapp订阅产品
- 我可以在谷歌玩游戏中使用相同的排行榜和成就安卓游戏
- Android - 从CH Play打开时恢复应用程序
- android面临崩溃报告仅适用于8.0和8.1中的firebase通知
- 在Play商店中推送特定版本的android的更新
- 实施InApp购买