.net6mvc 添加cookie身份验证

2023 年 6 月 9 日 星期五
2

.net6mvc 添加cookie身份验证

在 .NET 6 MVC 应用程序中,可以使用 Cookie 身份验证方案为用户提供身份验证功能。要添加 Cookie 身份验证,需要遵循以下步骤:

步骤 1:在 Startup.ConfigureServices 方法中配置身份验证和授权服务。
public void ConfigureServices(IServiceCollection services)
{
    ...

    // 添加身份验证服务
    services.AddAuthentication(options =>
    {
        options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;  // 设置默认身份验证方案为 Cookie
    })
    .AddCookie(options =>
    {
        options.Cookie.Name = "YourApplicationCookie";  // 设置cookie名称
        options.LoginPath = "/Account/Login";  // 设置未经授权用户在尝试访问需要授权的路径时要重定向的URL
        options.LogoutPath = "/Account/Logout";  // 设置注销的URL
    });

    // 添加授权服务
    services.AddAuthorization();

    ...
}
步骤 2:在 Startup.Configure 方法中启用身份验证和授权中间件。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    ...

    // 启用身份验证和授权中间件
    app.UseAuthentication();
    app.UseAuthorization();

    ...
}
步骤 3:在 AccountController 中添加登录和注销 Action。
public class AccountController : Controller
{
    ...

    [HttpGet]
    public IActionResult Login()
    {
        return View();
    }

    [HttpPost]
    public async Task<IActionResult> Login(LoginViewModel model, string returnUrl)
    {
        if (ModelState.IsValid)
        {
            var user = await _userService.AuthenticateAsync(model.UserName, model.Password);
            if (user != null)
            {
                // 创建身份验证票据
                var claims = new List<Claim>
                {
                    new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
                    new Claim(ClaimTypes.Name, user.UserName)
                };
                var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);

                // 发送身份验证票据
                await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(claimsIdentity));
                
                // 重定向到 returnUrl 或 特定页面
                if (!string.IsNullOrEmpty(returnUrl) && Url.IsLocalUrl(returnUrl))
                {
                    return Redirect(returnUrl);
                }
                else
                {
                    return RedirectToAction("Index", "Home");
                }
            }
            else
            {
                ModelState.AddModelError(string.Empty, "用户名或密码不正确。");
            }
        }

        return View(model);
    }

    [HttpPost]
    public async Task<IActionResult> Logout()
    {
        // 注销身份验证票据
        await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);

        // 重定向到登录页面
        return RedirectToAction("Login", "Account");
    }
}

在登录 Action 中,当用户通过身份验证时,会创建并发送包含用户身份信息的 cookie。在注销 Action 中,cookie 会被删除。

步骤 4:将 [Authorize] 特性添加到需要授权的 Action 或 Controller 中。

在需要授权的地方,可以将 [Authorize] 特性添加到 Action 或 Controller 上。例如:

[Authorize]
public class MyController : Controller
{
    ...
}

public class HomeController : Controller
{
    public IActionResult Index()
    {
        ...
    }

    [Authorize]
    public IActionResult Secret()
    {
        ...
    }
}

在此示例中,MyController 中的所有 Action 都需要身份验证,而 HomeController 中的 Index Action 不需要身份验证,但 Secret Action 需要身份验证才能访问。

使用社交账号登录

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...