显示或隐藏基于身份验证MVC Core 3.1.9的某些html元素

时间:2020-10-26 11:07:10

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

在我的网站上,我已经基于使用身份验证显示或隐藏了某些元素,但是由于某些原因,这无法正常工作。请看下面的代码 如果单击登录按钮,登录操作将成功通过,但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>();
    }

AccountController /登录

[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>

1 个答案:

答案 0 :(得分:0)

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

这是工作示例。

@Component({
  // ...
})
export class AppComponent implements OnInit {

  constructor(private navigationService: NavigationService) {}

  ngOnInit() {
    this.navigationService.navigation$.pipe(
      distinctUntilChanged(),
    ).subscribe(navigationItem => this.scrollIntoView(navigationItem))
  }

  private scrollIntoView(component) {
    // Scrolling logic ...
  }
}