SignInManager.IsSignedIn(User) 在 _Layout.cshtml 中始终为 false

问题描述 投票:0回答:1

我使用 Identity 创建了一个示例 Web 应用程序来管理身份验证。

但目前我在 _Layout.cshtml 中面临一个问题,SignInManager.IsSignedIn(User) 始终为 false(即使用户登录成功):

这是_Layout.cshtml文件


    @using Microsoft.AspNetCore.Identity
@inject SignInManager<IdentityUser> SignInManager
@inject UserManager<IdentityUser> UserManager

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - SampleWebApplication</title>
    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" />
    <link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
    <link rel="stylesheet" href="~/SampleWebApplication.styles.css" asp-append-version="true" />
</head>
<body>
    <header>
        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
            <div class="container">
                <a class="navbar-brand" asp-area="" asp-page="/Index">Sample Web Application</a>
                <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                        aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                </button>
                <div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
                    @if (SignInManager.IsSignedIn(User))
                    {
                        <ul class="navbar-nav flex-grow-1">
                            <li class="nav-item">
                                <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
                            </li>
                              <li class="nav-item">
                                <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
                            </li>
                        </ul>
                         <ul class="navbar-nav d-flex justify-content-end">
                            <li class="nav-item">
                                <a class="btn btn-primary" asp-area="" asp-page="/Logout">Logout</a>
                            </li> 
                        </ul>
                    }
                    else
                    {
                         <ul class="navbar-nav d-flex justify-content-end flex-grow-1 ">
                            <li class="nav-item">
                                <a asp-page="/Login" class="btn btn-primary">Login</a>
                            </li>
                              <li class="nav-item">
                               <a asp-page="/Register" class="btn">Register</a>
                            </li>
                        </ul>
                    }
                </div>
            </div>
        </nav>
    </header>
    <div class="container">
        <main role="main" class="pb-3">
            @RenderBody()
        </main>
    </div>

    <footer class="border-top footer text-muted">
        <div class="container">
            &copy; 2024 - SampleWebApplication - <a asp-area="" asp-page="/Privacy">Privacy</a>
        </div>
    </footer>

    <script src="~/lib/jquery/dist/jquery.min.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>

    @await RenderSectionAsync("Scripts", required: false)
</body>
</html>

这是Program.cs文件

using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.SqlServer;
using SampleWebApplication.Model;

var builder = WebApplication.CreateBuilder(args);


var connectionString = builder.Configuration.GetConnectionString("AuthConnectionString") ?? throw new InvalidOperationException();

// Add services to the container.

builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

builder.Services.AddIdentity<IdentityUser, IdentityRole>().AddEntityFrameworkStores<AuthDbContext>();

builder.Services.AddDbContext<AuthDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("AuthConnectionString")));


var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}


app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
app.UseAuthentication();

有人可以建议我哪里出错了吗?另外我希望 SignInManager.IsSignedIn(User) 在成功登录后返回 true。

c# asp.net asp.net-mvc asp.net-core
1个回答
0
投票

Startup.cs 文件中的中间件组件需要按照正确的顺序进行配置,以在授权之前处理身份验证。

在您的 Program.cs 中,

app.UseAuthorization();

之前已注册:

app.UseAuthentication();

这是不正确的。必须在调用授权中间件之前调用身份验证中间件。确保在执行任何授权检查之前建立用户身份并与请求关联,就像您在 _Layout.cshtml 中使用的情况一样。

© www.soinside.com 2019 - 2024. All rights reserved.