我想知道哪个组件会验证传入的身份验证 cookie 并将
HttpContext.User.Identity.IsAuthenticated
设置为 true,甚至在第一个中间件组件执行之前,即使我在中间件管道中根本没有 app.UseAuthentication()
。
到目前为止,我希望这个身份验证中间件组件能够完成这项工作。我创建了一个自定义中间件模块,将其添加到中间件管道的第一个位置,当调用此模块时,
IsAuthenticated
已经为真 - 只要浏览器传入有效的 cookie。有人可以解释一下谁或什么评估了 cookie 并将 IsAuthenticated
设置为 true 吗?
我有一个简单的登录页面来输入名称/密码,最终出现在以下后处理程序中 - 不,那不是生产代码! :)
public async Task<IActionResult> OnPostAsync()
{
if (!ModelState.IsValid)
return Page();
if (Credential is { UserName: "admin", Password: "password" })
{
var claims = new List<Claim>
{
new Claim(ClaimTypes.Name, "admin"),
new Claim(ClaimTypes.Email, "[email protected]")
};
var identity = new ClaimsIdentity(claims, "MyCookieAuth");
var claimsPrincipal = new ClaimsPrincipal(identity);
await HttpContext.SignInAsync("MyCookieAuth", claimsPrincipal);
return Redirect("/index");
}
return Page();
}
这是
program.cs
:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddAuthentication().AddCookie("MyCookieAuth", options =>
{
options.Cookie.Name = "MyCookieAuth";
});
var app = builder.Build();
app.UseStaticFiles();
app.UseRouting();
app.MapRazorPages();
app.Run();
还有一个简单的
index.cshtml
来显示IsAuthenticated
的状态:
@page
@model IndexModel
<div class="text-center">
<p>IsAuthenticated: @HttpContext.User.Identity.IsAuthenticated</p>
</div>
当我成功登录时,cookie 会发送回浏览器,我会被重定向到索引页面,并且我已通过身份验证,一切都很好并且可以理解。
但是,如果我带着该 cookie 返回,直接进入索引页面,我会立即通过身份验证。正如你所看到的,我确实没有有
app.UseAuthentication();
在管道中。怎么办?
发生这种情况是因为身份验证处理程序是由 ASP.Net Core 自动注册的。 通常我们在中间件中添加
app.UseAuthentication()
,
即使您尚未添加它,它也会由于 Program.cs 中的 AddAuthentication() 代码而自动注册,这将设置 HttpContext.User 的身份验证。
builder.Services.AddAuthentication().AddCookie("MyCookieAuth", options =>
{
options.Cookie.Name = "MyCookieAuth";
});
Cookie 身份验证处理程序将检查身份验证 cookie 的请求,如果找到有效的 cookie,它将对用户进行身份验证并设置
HttpContext.User.IsAuthenticated to True.