ASP.NET MVC Authorize with login authentication 不工作
ASP.NET MVC Authorize with login authentication not working
我正在尝试在我的 ASP.NET MVC 项目中实现 cookie 身份验证,并且我已经根据我的研究编写了所有代码。
真不知道怎么回事。我怀疑我的项目的文件夹层次结构已关闭,但事实并非如此。但可能是剃刀页面未映射或创建 [Authorize]
属性。我不知道
登录后正确创建了 cookie,但如果我在没有 cookie 的情况下放置任何 URL,页面加载未经授权
我对这个项目的意图是有一个带有一些菜单的开放主页和一个用于数据管理的隐藏管理面板。如果还有其他关于如何保护管理页面的建议,我会洗耳恭听。
我的项目中没有角色。
这是我的代码。
startup.cs
public class Startup
{
public IConfiguration Configuration { get; }
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public void ConfigureServices(IServiceCollection services)
{
var connectionString = Configuration.GetConnectionString("DefaultConnection");
services.AddControllersWithViews();
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Latest);
services.AddAuthentication("CookieAuth").AddCookie("CookieAuth", options =>
{
options.Cookie.Name = "CookieAuth";
options.LoginPath = "/Secure/Login";
//options.ExpireTimeSpan = TimeSpan.FromHours(1);
//options.AccessDeniedPath = "/Secure/Login";
});
services.AddRazorPages();
services.AddDbContext<ApplicationContext>(options =>
{
options.EnableSensitiveDataLogging();
options.UseSqlServer("Server=LAPTOP-QJIOM3MT;Database=BasePistas;Trusted_connection=True;");
});
services.AddScoped<IUnitOfWork, UnitOfWork>();
services.AddScoped<IUsuarioBusiness, UsuarioBusiness>();
services.AddScoped<IPistaBusiness, PistaBusiness>();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseCookiePolicy();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
}
这是我的具有授权属性的控制器:
using Microsoft.AspNetCore.Authentication;
[Authorize]
public class AprovacoesController : Controller
{
[Authorize]
public IActionResult Consultar()
{
var aprovacoes = _pistaBusiness.Filtrar();
return View("Consulta",aprovacoes);
}
}
我认为我的登录身份验证是正确的,但我会把它放在这里 - LoginController
:
[AllowAnonymous]
[HttpPost]
public async Task<IActionResult> Login(LoginDto model)
{
if (ModelState.IsValid)
{
var usuario = this._usuarioBusiness.Autenticar(model);
if (usuario != null)
{
var claims = new List<Claim>()
{
new Claim(ClaimTypes.NameIdentifier, usuario.IdUsuario.ToString()),
new Claim(ClaimTypes.Name, usuario.Nome),
new Claim(ClaimTypes.GivenName, usuario.Login)
};
var identity = new ClaimsIdentity(claims, "CookieAuth");
var principal = new ClaimsPrincipal(identity);
await HttpContext.SignInAsync("CookieAuth", principal);
return RedirectToAction("Index", "Home");
}
else
{
model = new LoginDto();
TempData["ErroAutenticacao"] = "Usuário ou senha inválido";
return View(model);
}
}
return View(model);
}
public async Task<IActionResult> Logout()
{
await HttpContext.SignOutAsync("CookieAuth");
return RedirectToAction("Login", "Secure");
}
这是文件夹层次结构
我已经找到了解决方案。
一切正常!!
授权无效的原因是我在调试 IIS Expres 而不是我的项目 webapp。
我仍在学习很多关于 ASP.NET 和 Visual Studio 社区平台的知识,这些细节真的很重要。
如果有人想使用这个 Auth 模型,它工作正常。
我正在尝试在我的 ASP.NET MVC 项目中实现 cookie 身份验证,并且我已经根据我的研究编写了所有代码。
真不知道怎么回事。我怀疑我的项目的文件夹层次结构已关闭,但事实并非如此。但可能是剃刀页面未映射或创建 [Authorize]
属性。我不知道
登录后正确创建了 cookie,但如果我在没有 cookie 的情况下放置任何 URL,页面加载未经授权
我对这个项目的意图是有一个带有一些菜单的开放主页和一个用于数据管理的隐藏管理面板。如果还有其他关于如何保护管理页面的建议,我会洗耳恭听。
我的项目中没有角色。
这是我的代码。
startup.cs
public class Startup
{
public IConfiguration Configuration { get; }
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public void ConfigureServices(IServiceCollection services)
{
var connectionString = Configuration.GetConnectionString("DefaultConnection");
services.AddControllersWithViews();
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Latest);
services.AddAuthentication("CookieAuth").AddCookie("CookieAuth", options =>
{
options.Cookie.Name = "CookieAuth";
options.LoginPath = "/Secure/Login";
//options.ExpireTimeSpan = TimeSpan.FromHours(1);
//options.AccessDeniedPath = "/Secure/Login";
});
services.AddRazorPages();
services.AddDbContext<ApplicationContext>(options =>
{
options.EnableSensitiveDataLogging();
options.UseSqlServer("Server=LAPTOP-QJIOM3MT;Database=BasePistas;Trusted_connection=True;");
});
services.AddScoped<IUnitOfWork, UnitOfWork>();
services.AddScoped<IUsuarioBusiness, UsuarioBusiness>();
services.AddScoped<IPistaBusiness, PistaBusiness>();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseCookiePolicy();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
}
这是我的具有授权属性的控制器:
using Microsoft.AspNetCore.Authentication;
[Authorize]
public class AprovacoesController : Controller
{
[Authorize]
public IActionResult Consultar()
{
var aprovacoes = _pistaBusiness.Filtrar();
return View("Consulta",aprovacoes);
}
}
我认为我的登录身份验证是正确的,但我会把它放在这里 - LoginController
:
[AllowAnonymous]
[HttpPost]
public async Task<IActionResult> Login(LoginDto model)
{
if (ModelState.IsValid)
{
var usuario = this._usuarioBusiness.Autenticar(model);
if (usuario != null)
{
var claims = new List<Claim>()
{
new Claim(ClaimTypes.NameIdentifier, usuario.IdUsuario.ToString()),
new Claim(ClaimTypes.Name, usuario.Nome),
new Claim(ClaimTypes.GivenName, usuario.Login)
};
var identity = new ClaimsIdentity(claims, "CookieAuth");
var principal = new ClaimsPrincipal(identity);
await HttpContext.SignInAsync("CookieAuth", principal);
return RedirectToAction("Index", "Home");
}
else
{
model = new LoginDto();
TempData["ErroAutenticacao"] = "Usuário ou senha inválido";
return View(model);
}
}
return View(model);
}
public async Task<IActionResult> Logout()
{
await HttpContext.SignOutAsync("CookieAuth");
return RedirectToAction("Login", "Secure");
}
这是文件夹层次结构
我已经找到了解决方案。
一切正常!!
授权无效的原因是我在调试 IIS Expres 而不是我的项目 webapp。
我仍在学习很多关于 ASP.NET 和 Visual Studio 社区平台的知识,这些细节真的很重要。
如果有人想使用这个 Auth 模型,它工作正常。