首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >User.Identity.IsAuthenticated返回true,但Conventions.AuthorizeFolder仍然将用户视为未经授权的用户。

User.Identity.IsAuthenticated返回true,但Conventions.AuthorizeFolder仍然将用户视为未经授权的用户。
EN

Stack Overflow用户
提问于 2019-12-11 04:09:05
回答 1查看 690关注 0票数 0

我正在使用C#、.NET Core3.0和Razor开发一个简单的web应用程序。我有一个要限制访问权限的文件夹(/Admin)。没有授权组;您要么被授权,要么没有授权。

正如标题中所提到的,我在尝试实现这一点时遇到了一个障碍。

据我所知,我已经使用了登录方法。我打电话给HttpContext.SignInAsync(),然后确认User.Identity.IsAuthenticatedtrue。但是,现在已通过身份验证的用户仍然无法访问/Admin页面.它们被options.Conventions.AuthorizeFolder("/Admin")弹回登录页面。登录页面将用户视为身份验证,结果是一个重定向循环。

我一直在使用以下资源:

有人能帮我弄清楚我到底哪里出了问题吗?

(我已经将这段代码大大简化为我认为是相关和必要的代码,但是如果您觉得我遗漏了一些重要的东西,请告诉我。)

Startup.cs

代码语言:javascript
复制
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

代码语言:javascript
复制
public async Task<IActionResult> OnGetAsync()
{
    if (_authService.IsLoggedIn())
        return RedirectToPage("Index");

    await _authService.LoginAsync("testemail@test.com", "testpassword", true);
    return Page();
}

AuthService.cs

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-11 04:41:10

在和样本代码做了逐行比较之后才算出来。

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

交换这两行就解决了这个问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59278777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档