ASP.NET Core身份验证

asp.net core 身份验证

本文旨在演示若是使用内置的 identity 实现 asp.net core 的身份验证,不会进行其它扩展。本文将经过最简单的代码演示如何进行登陆和身份验证操做。app

使用Authentication

咱们建立好 asp.net core 项目之后,须要在ConfigureServices中添加Authentication的服务配置,代码以下:asp.net

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, o =>
    {
        o.LoginPath = new PathString("/Account/Login");
        o.AccessDeniedPath = new PathString("/Account/AccessDenied");
    });

而后,在Configure中添加上以下代码,注意,UseAuthentication要放在UseMvc前面。async

app.UseAuthentication();
app.UseMvc().UseMvcWithDefaultRoute();

添加Account控制器

在完成第一步后,咱们须要添加一个控制器,来进行登陆、退出等操做,一般把这些功能放在AccountController中。关键代码以下:ide

/// <summary>
/// 登陆页面
/// </summary>
/// <returns></returns>
public IActionResult Login()
{
    return View();
}

/// <summary>
/// 模拟登陆
/// </summary>
/// <param name="userName"></param>
/// <returns></returns>
[HttpPost]
public async Task<IActionResult> Login(string userName)
{
    //根据登陆名获取用户身份,以及判断密码等操做
    var user = new SysUserIdentity { Name = userName, IsAuthenticated = true };

    if (user != null)
    {
        user.AuthenticationType = CookieAuthenticationDefaults.AuthenticationScheme;
        var identity = new ClaimsIdentity(user);
        identity.AddClaim(new Claim(ClaimTypes.Name, user.Name));

        await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(identity));

        return Redirect("/Account");
    }
    ViewBag.Errormessage = "登陆失败,用户名密码不正确";
    return View();
}

/// <summary>
/// 退出登陆
/// </summary>
/// <returns></returns>
public async Task<IActionResult> Logout()
{
    await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
    return Redirect("/Account");
}

每个Action的做用以下:.net

  • Login - Get:用来响应Get请求,提供用户输入用户名、密码的页面。
  • Login - Post:用来响应Post请求,对用户输入的用户名和密码进行验证,验证经过后分发票据
  • Logout - Get:用来响应Get请求,退出登陆。

获取用户身份

当用户经过上面的代码登陆之后,在用户访问其它页面时,咱们须要获取到用户的身份,为了演示如何获取到身份信息,咱们想AccountController中添加一个Index页面,代码以下:code

/// <summary>
/// 获取登陆人信息
/// </summary>
/// <returns></returns>
[Authorize]
public async Task<IActionResult> Index()
{
    var auth = await HttpContext.AuthenticateAsync(CookieAuthenticationDefaults.AuthenticationScheme);
    if (auth.Succeeded)
    {
        string userName = auth.Principal.Identity.Name;
        //从新获取用户身份
        var user = new SysUserIdentity() { Name = userName, IsAuthenticated = true };
        return View(user);
    }

    return Redirect("~/Account/Login");
}
相关文章
相关标签/搜索