在我的网站上,我已经根据使用身份验证显示或隐藏了某些元素,但由于某些原因,这不起作用。请看下面的代码,如果单击登录按钮,登录操作将成功通过,但signInManager.IsSignedIn(用户)将返回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>
发布于 2020-10-26 13:39:54
IsAuthenticated适用于所有类型的ClaimsPrincipals,这些类型可能来自ASP.NET核心身份、社交或其他任何类型。对于ASP.NET身份,IsSignedIn是非常特定的。
这是一个有效的例子。
@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>
}
https://stackoverflow.com/questions/64535918
复制相似问题