ASP.NET Core 认证与授权实践

在构建Web应用程序时,用户认证和授权是两个核心功能。ASP.NET Core 提供了一套强大的机制来处理这些任务。本文将介绍如何在ASP.NET Core MVC项目中实现用户登录、登出以及使用授权属性保护页面。

创建项目并配置服务

首先,创建一个新的ASP.NET Core MVC项目。然后,更新 Startup.cs 文件以配置MVC和认证服务:

public void ConfigureServices(IServiceCollection services) { services.AddAuthentication("FiverSecurityScheme") .AddCookie("FiverSecurityScheme", options => { options.AccessDeniedPath = new PathString("/Security/Access"); options.LoginPath = new PathString("/Security/Login"); }); services.AddMvc(); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.UseAuthentication(); app.UseMvcWithDefaultRoute(); }

在上述代码中,添加了基于Cookie的认证服务,并配置了访问被拒绝时重定向的路径和登录路径。

创建登录模型

接下来,创建一个模型来接收登录详情:

public class LoginInputModel { public string Username { get; set; } public string Password { get; set; } }

这个模型包含用户名和密码两个属性,用于在登录表单中收集用户输入。

创建登录页面

创建一个登录页面,使用ASP.NET Core的Tag Helpers来生成表单:

<form asp-controller="Security" asp-action="Login" method="post"> <input type="text" name="username" id="username" /> <input type="password" name="password" id="password" /> <input type="submit" value="Login" /> </form>

这个表单将数据提交到Security控制器的Login动作。

创建控制器

创建一个控制器来处理登录和登出动作:

public IActionResult Login() { return View(); } [HttpPost] public async Task Login(LoginInputModel inputModel) { if (!IsAuthentic(inputModel.Username, inputModel.Password)) return View(); List<Claim> claims = new List<Claim> { new Claim(ClaimTypes.Name, "Sean Connery"), new Claim(ClaimTypes.Email, inputModel.Username) }; ClaimsIdentity identity = new ClaimsIdentity(claims, "cookie"); ClaimsPrincipal principal = new ClaimsPrincipal(identity); await HttpContext.SignInAsync("FiverSecurityCookie", principal); return RedirectToAction("Index", "Home"); } public async Task Logout() { await HttpContext.SignOutAsync("FiverSecurityCookie"); return RedirectToAction("Login"); }

在Login动作中,首先检查用户名和密码是否有效。如果有效,创建用户的身份声明,然后使用HttpContext.SignInAsync方法进行登录。登出动作则使用HttpContext.SignOutAsync方法。

使用[Authorize]属性保护页面

使用Authorize属性来保护需要认证的页面:

[Authorize] public class HomeController : Controller { public IActionResult Index() { return View(); } }

这个HomeController中的Index动作现在需要用户登录后才能访问。

讨论

认证中间件会拦截传入的请求并检查是否存在包含加密用户数据的Cookie。如果找到Cookie,它将被反序列化为ClaimsPrincipal类型,可以通过HttpContext.User属性访问。如果没有找到Cookie,中间件将使用动作方法重定向到登录页面。通过登录页面,将接收到用户详情并将其与数据库记录进行认证。一旦认证成功,需要:

  • 创建与用户身份相关的List<Claim>。
  • 创建ClaimsIdentity,分配声明并指定认证类型。
  • 创建ClaimsPrincipal并分配身份。
  • 调用HttpContext.SignInAsync方法,传入认证方案名称(通过服务设置)和Principal。

Cookie认证选项允许开发者在认证过程的不同生命周期阶段挂钩事件。例如,可以使用OnSignedIn记录成功的登录,或者使用OnValidatePrincipal(每次请求都会运行)来使用户失效(例如,如果想强制用户登出)。

注销

要删除认证Cookie并注销用户,可以调用HttpContext.SignOutAsync方法,并传入认证方案名称。

await HttpContext.SignInAsync("FiverSecurityScheme", principal, new AuthenticationProperties { ExpiresUtc = DateTime.UtcNow.AddMinutes(1) });
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485