【问题标题】:Show or hide certain html elements based on authentication mvc core 3.1.9基于身份验证 mvc core 3.1.9 显示或隐藏某些 html 元素
【发布时间】:2021-02-08 15:19:50
【问题描述】:

在我的网站中,我根据使用身份验证显示或隐藏某些元素,但由于某种原因,这不起作用。请看下面的代码 如果您单击登录按钮,登录操作将成功通过,但 signInManager.IsSignedIn(User) 将返回 false

startup.cs

public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersWithViews();
        services.AddDbContextPool<ApplicationDbContext>(option => option.UseSqlServer(Configuration.GetConnectionString("DBConnection")));

        services.AddIdentity<ApplicationUser, IdentityRole>(options =>
        {
            options.Password.RequiredLength = 8;
            options.Password.RequiredUniqueChars = 4;
            options.SignIn.RequireConfirmedEmail = false;
            options.Tokens.EmailConfirmationTokenProvider = "EmailConfirmation";
            options.Lockout.MaxFailedAccessAttempts = 5;
            options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(15);

        })
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders()
        .AddTokenProvider<EmailConfirmationTokenProvider<ApplicationUser>>("EmailConfirmation");

        services.Configure<DataProtectionTokenProviderOptions>(o =>
                   o.TokenLifespan = TimeSpan.FromHours(5));

        services.Configure<EmailConfirmationTokenProviderOptions>(o =>
                    o.TokenLifespan = TimeSpan.FromDays(3));

        
        services.Configure<DataProtectionTokenProviderOptions>(o =>
                    o.TokenLifespan = TimeSpan.FromHours(5));

        services.Configure<EmailConfirmationTokenProviderOptions>(o =>
                    o.TokenLifespan = TimeSpan.FromDays(3));

        services.AddSingleton<DataProtectionPurposeStrings>();
    }

帐户控制器/登录

[HttpPost]
    [AllowAnonymous]
    public async Task<IActionResult> Login(LoginViewModel model, string returnUrl)
    {
        

        if (ModelState.IsValid)
        {
            var user = await userManager.FindByEmailAsync(model.Email);             
            var result = await signInManager.PasswordSignInAsync(model.Email, model.Password, false, true);

            if (result.Succeeded)
            {
                if (!string.IsNullOrEmpty(returnUrl) && Url.IsLocalUrl(returnUrl))
                {
                    return Redirect(returnUrl);
                }
                else
                {
                    return RedirectToAction("index", "home");
                }
            }

            if (result.IsLockedOut)
            {
                return View("AccountLocked");
            }

            ModelState.AddModelError(string.Empty, "Invalid Login Attempt");
        }

        return View(model);
    }

和导航栏

@inject SignInManager<ApplicationUser> signInManager;
<header dir="rtl">
    <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-controller="Home" asp-action="Index">Home</a>
            <button class="navbar-toggler" type="button" data-toggle="collapse" data-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">
                <ul class="navbar-nav flex-grow-1">
                    <li class="nav-item">
                        <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Index">Link1</a>
                    </li>

                    <li class="nav-item">
                        <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Index">Link2</a>
                    </li>
                    @*<li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
                        </li>*@
                </ul>
                <ul class="navbar-nav">

                    @if (signInManager.IsSignedIn(User))
                    {
                        <li class="nav-item">
                            <form method="post" asp-action="logout" asp-controller="account">
                                <button type="submit" class="nav-link btn btn-link py-0">
                                    Logout @User.Identity.Name
                                </button>
                            </form>
                        </li>
                    }
                    else
                    {
                        <li class="nav-item">
                            <a asp-action="login" asp-controller="account" class="nav-link text-dark">Login</a>
                        </li>
                    }

                </ul>
            </div>
        </div>
    </nav>
</header>

【问题讨论】:

    标签: c# razor entity-framework-core asp.net-core-mvc


    【解决方案1】:

    IsAuthenticated 适用于所有类型的 ClaimsPrincipal,它们可能来自 ASP.NET Core Identity、Social 或其他任何类型。 IsSignedIn 非常特定于 ASP.NET 身份。

    这是工作示例。

    @if (User.Identity.IsAuthenticated)
    {
      <a class="button" asp-controller="Account" asp-action="Logout">Sign Out</a>
    }
    else
    {
        <a class="button" asp-page="/Accounts/Login"> Sign in </a>
    }
    

    【讨论】:

    • 也已经使用过该解决方案,但仍然无法正常工作
    • 尝试在 Startup.cs 的 ConfigureServices 方法中添加 services.AddAuthorization()app.UseAuthentication();app.UseAuthorization();Configure 方法中
    猜你喜欢
    • 2018-04-28
    • 2022-11-11
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多