C# User.Identity.IsAuthenticated返回true,但Conventions.authorized文件夹仍会将用户反弹为未经授权

C# User.Identity.IsAuthenticated返回true,但Conventions.authorized文件夹仍会将用户反弹为未经授权,c#,asp.net-core,razor,C#,Asp.net Core,Razor,我正在使用C#、.NETCore3.0和Razor开发一个简单的web应用程序。我有一个文件夹(/Admin),我想限制对该文件夹的访问。没有授权组;你不是被授权就是没有被授权 如标题所述,我在尝试实现此功能时遇到了一个障碍 据我所知,我已经使用了登录方法。我调用了HttpContext.SignInAsync(),并确认User.Identity.IsAuthenticated此后为true。但是,现在经过身份验证的用户仍然无法访问/Admin页面。它们通过options.Convention

我正在使用C#、.NETCore3.0和Razor开发一个简单的web应用程序。我有一个文件夹(
/Admin
),我想限制对该文件夹的访问。没有授权组;你不是被授权就是没有被授权

如标题所述,我在尝试实现此功能时遇到了一个障碍

据我所知,我已经使用了登录方法。我调用了
HttpContext.SignInAsync()
,并确认
User.Identity.IsAuthenticated
此后为
true
。但是,现在经过身份验证的用户仍然无法访问
/Admin
页面。它们通过
options.Conventions.AuthorizeFolder(“/Admin”)
返回到登录页面。登录页面将用户视为已验证,结果是重定向循环

我一直在使用以下资源:

有人能帮我说明我到底哪里做错了吗

(我已将此代码大幅缩减为我认为相关且必要的代码,但如果您觉得我遗漏了一些重要内容,请告诉我。)

Startup.cs

public void配置服务(IServiceCollection服务)
{
services.AddAntiforgery(o=>o.HeaderName=“XSRF-TOKEN”);
services.AddTransient();
services.AddSingleton();
services.AddDbContext(选项=>
选项。使用SQLServer(配置[“ConnectionString:DefaultConnection”])
);
services.AddRazorPages(选项=>{
options.Conventions.authorized文件夹(“/Admin”);
options.Conventions.AllowAnonymousToPage(“/Admin/Login”);
});
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(选项=>{options.LoginPath=“/Admin/Login”;});
}
public void配置(IApplicationBuilder应用程序、IWebHostEnvironment环境)
{
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
其他的
{
app.UseRewriter(新的重写选项().AddRedirectToWwwPermanent());
app.UseExceptionHandler(“/Error”);
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseAuthentication();
app.UseEndpoints(端点=>
{
endpoints.MapRazorPages();
});
}
Pages/Admin/Login.cshtml.cs

公共异步任务OnGetAsync() { if(_authService.IsLoggedIn()) 返回至Topage(“索引”); wait\u authService.LoginAsync(“testemail@test.com“,”testpassword“,true); 返回页(); } AuthService.cs

公共异步任务登录同步(字符串电子邮件、字符串密码、bool rememberMe)
{
var user=_db.Users.FirstOrDefault(u=>u.Email==Email);
如果(user==null)抛出新异常(“未找到电子邮件”);
var验证=验证密码(用户、密码);
if(验证==PasswordVerificationResult.Failed)
抛出新异常(“密码不正确”);
if(验证==PasswordVerificationResult.SuccessRehashRequired)
重新设置密码(用户、密码);
var identity=newclaimsidentity(CookieAuthenticationDefaults.AuthenticationScheme,ClaimTypes.Name,ClaimTypes.Role);
identity.AddClaim(新索赔(ClaimTypes.NameIdentifier,电子邮件));
identity.AddClaim(新索赔(ClaimTypes.Name,email));
var principal=新的ClaimsPrincipal(身份);
wait_contextAccessor.HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme,主体,新的AuthenticationProperties{IsPersistent=rememberMe});
}
公共图书馆IsLoggedIn()
{
return_contextAccessor.HttpContext.User.Identity.IsAuthenticated;
}

在与进行逐行比较后得出了答案

在Startup.cs
Configure
方法中,
app.UseAuthentication()
必须位于app.UseAuthentication()之前

交换这两行解决了问题