DaI*_*mTo 1 c# asp.net asp.net-core-mvc .net-core asp.net-core
我有一个简单的控制器,在用户登录后调用.我可以在我的身份服务器上看到用户已登录.我还可以看到.AspNetCore.Identity.Application cookie在浏览器中设置.
登录后,用户将转发到此控制器
RedirectToAction(nameof(Index), "Manage")
Run Code Online (Sandbox Code Playgroud)
问题是控制器似乎没有经过身份验证.我已经尝试过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.
}
}
Run Code Online (Sandbox Code Playgroud)
我找到了一个强制它加载cookie的工作
var loadTheStupidCookie = await HttpContext.AuthenticateAsync(IdentityConstants.ApplicationScheme);
var user = await _userManager.GetUserAsync(loadTheStupidCookie.Principal);
Run Code Online (Sandbox Code Playgroud)
这有效,但我认为它必须在控制器中的每个方法中加载它.控制器不应该能够为我加载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";
});
Run Code Online (Sandbox Code Playgroud)
注意:删除[AllowAnonymous]会导致它无法正常工作,因为它无法看到身份验证.
使用该Authorize
属性时,它将使用默认AuthenticationScheme
配置使用AddAuthentication
.在您的示例中,看起来像这样:
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
Run Code Online (Sandbox Code Playgroud)
因为这是CookieAuthenticationDefaults.AuthenticationScheme
("Cookies"),该Authorize
属性在尝试对用户进行签名时使用该属性.您的解决方法显示您实际上想要使用IdentityConstants.ApplicationScheme
("Identity.Application")`.
该Authorize
属性允许您使用属性指定AuthenticationScheme
要使用的(s)AuthenticationSchemes
,如下所示:
[Authorize(AuthenticationSchemes = "Identity.Application")]
Run Code Online (Sandbox Code Playgroud)
事实证明你不能IdentityConstants.ApplicationScheme
直接使用,因为这不是编译时常量.虽然您可以显式使用字符串值,但您可以通过设置策略来获得编译时安全性.有关如何执行此操作的示例,请参阅文档.
归档时间: |
|
查看次数: |
1792 次 |
最近记录: |