我正在使用C#、.NET Core3.0和Razor开发一个简单的web应用程序。我有一个要限制访问权限的文件夹(/Admin)。没有授权组;您要么被授权,要么没有授权。
正如标题中所提到的,我在尝试实现这一点时遇到了一个障碍。
据我所知,我已经使用了登录方法。我打电话给HttpContext.SignInAsync(),然后确认User.Identity.IsAuthenticated是true。但是,现在已通过身份验证的用户仍然无法访问/Admin页面.它们被options.Conventions.AuthorizeFolder("/Admin")弹回登录页面。登录页面将用户视为身份验证,结果是一个重定向循环。
我一直在使用以下资源:
有人能帮我弄清楚我到底哪里出了问题吗?
(我已经将这段代码大大简化为我认为是相关和必要的代码,但是如果您觉得我遗漏了一些重要的东西,请告诉我。)
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddAntiforgery(o => o.HeaderName = "XSRF-TOKEN");
services.AddTransient<IAuthService, AuthService>();
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddDbContext<Entities.WeddingContext>(options =>
options.UseSqlServer(Configuration["ConnectionStrings:DefaultConnection"])
);
services.AddRazorPages(options => {
options.Conventions.AuthorizeFolder("/Admin");
options.Conventions.AllowAnonymousToPage("/Admin/Login");
});
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options => { options.LoginPath = "/Admin/Login"; });
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseRewriter(new RewriteOptions().AddRedirectToWwwPermanent());
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseAuthentication();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}Pages/Admin/Login.cshtml.cs
public async Task<IActionResult> OnGetAsync()
{
if (_authService.IsLoggedIn())
return RedirectToPage("Index");
await _authService.LoginAsync("testemail@test.com", "testpassword", true);
return Page();
}AuthService.cs
public async Task LoginAsync(string email, string password, bool rememberMe)
{
var user = _db.Users.FirstOrDefault(u => u.Email == email);
if (user == null) throw new Exception("Email not found.");
var verification = VerifyPassword(user, password);
if (verification == PasswordVerificationResult.Failed)
throw new Exception("Incorrect password.");
if (verification == PasswordVerificationResult.SuccessRehashNeeded)
RehashPassword(user, password);
var identity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme, ClaimTypes.Name, ClaimTypes.Role);
identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, email));
identity.AddClaim(new Claim(ClaimTypes.Name, email));
var principal = new ClaimsPrincipal(identity);
await _contextAccessor.HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal, new AuthenticationProperties { IsPersistent = rememberMe });
}
public bool IsLoggedIn()
{
return _contextAccessor.HttpContext.User.Identity.IsAuthenticated;
}发布于 2019-12-11 04:41:10
在和样本代码做了逐行比较之后才算出来。
在Startup.cs Configure方法中,app.UseAuthentication() 必须在 app.UseAuthorization()之前来。
交换这两行就解决了这个问题。
https://stackoverflow.com/questions/59278777
复制相似问题