zoukankan      html  css  js  c++  java
  • Net Core Identity 身份验证:注册、登录和注销 (简单示例)

    一、前言

      一般我们自己的系统都会用自己设置的一套身份验证授权的代码,这次用net core的identity来完成简单的注册、登录和注销。

    二、数据库

      首先就是创建上下文,我这里简单的建了Users和UserClaim表,要是没有UserClaim等下的登录操作是会报错的,应该是有身份认证方面的关系。

        public class DataBaseContext : DbContext
        {
            public DataBaseContext(DbContextOptions<DataBaseContext> options)
            : base(options)
            { }
            public DbSet<User> Users { get; set; }
            public DbSet<IdentityUserClaim<string>> UserClaim { get; set; }
        }
        public class User : IdentityUser
        {
            public string companyId { get; set; }
            public string PassWord { get; set; }
        }

      这里User继承了IdentityUser,IdentityUser中就用很多的基础字段,像是UserName等所以我们可以再User类中扩展我们的字段。

      add-migration Init和update-database Init再控制台执行,生成表。

    三、Startup注册服务

      在ConfigureServices中注册如下

      1、数据库上下文连接

      //添加数据库连接
      services.AddDbContext<DataBaseContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

      2、添加标识服务,包括默认的UI、令牌提供和身份验的cookie,并且添加identity信息存储的实体框架实现,用于关联数据库创建用户获取用户信息等。AddDefaultIdentity一个相当于AddIdentity、AddDefaultUI和AddDefaultTokenProviders三个。如果User不继承IdentityUser使用AddEntityFrameworkStores会报错。

      services.AddDefaultIdentity<User>().AddEntityFrameworkStores<DataBaseContext>();

      3、添加Identity的选项,可以设定密码的强度、长度、使用字符、密码输入错误次数等等。

        services.Configure<IdentityOptions>(options =>
        {
            // 密码设置
            options.Password.RequireDigit = false;
            options.Password.RequireLowercase = false;
            options.Password.RequireNonAlphanumeric = false;
            options.Password.RequireUppercase = false;
            options.Password.RequiredLength = 1;
            options.Password.RequiredUniqueChars = 1;
    
            // 锁定设置
            options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
            options.Lockout.MaxFailedAccessAttempts = 5;
            options.Lockout.AllowedForNewUsers = true;
    
            // 用户设置
            options.User.AllowedUserNameCharacters =
            "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
            options.User.RequireUniqueEmail = false;
        });

      4、配置应用程序的cookie

        services.ConfigureApplicationCookie(options =>
        {
            // Cookie设置
            options.Cookie.HttpOnly = true;
            options.ExpireTimeSpan = TimeSpan.FromMinutes(5);
    
            options.LoginPath = "/Login/Index";
            options.AccessDeniedPath = "/Home/Index";
            options.SlidingExpiration = true;
        });

      在Config中注册身份认证

      app.UseAuthentication();

    四、简单的登录、注册和注销

      既然是简单的例子,那我是真的怎么简单怎么来,代码也就没几条。

      先创建一个Home控制器并加上[Authorize]特性,没得到验证的就统统无法访问。按照上面的Startup.cs已经将UserManager依赖注入了,它是用来管理用户的比如注册啥的。

      [Authorize]
        public class HomeController : Controller
        { 
            private UserManager<User> userManager;public HomeController(UserManager<User> _userManager)
            {
                userManager = _userManager;
            }
            public async Task<IActionResult> Index()
            {
                var res = await userManager.GetUserAsync(HttpContext.User);
                return View();
            }
        }

      然后创建一个Login控制器,我们可以在里面写登录、注册和注销的方法。Login控制器除了UserManager外还要注入SignManager,它是用来用户登录、注销等操作的。

        public class LoginController : Controller
        {
            //用于提供持久性存储的用户信息
            private UserManager<User> userManager;
            private SignInManager<User> signManager;
            public LoginController(UserManager<User> _userManager,SignInManager<User> _signManager)
            {
                userManager = _userManager;
                signManager = _signManager;
            }
        }

      1、注册

       注册直接用CreateAsync方法,会自动在数据库创建用户。SignInAsync方法用于刚注册的马上用户登录。

            public async Task<IActionResult> Register()
            {
                var user = new User() { UserName = "xu2", PhoneNumber = "123", companyId = "1" };
                var result = await userManager.CreateAsync(user, "123");
                await signManager.SignInAsync(user, true);
                if (result.Succeeded)
                    return Redirect("/Home/Index");
                return Redirect("/Login/Index");
            }

      2、登录

      登录不能用SignInAsync了,要用PasswordSignInAsync密码登录

            public async Task<IActionResult> Index()
            {
                var s = await signManager.PasswordSignInAsync("xu", "123", true, false);
                return View();
            }

      3、注销

      这边直接return view()是无法注销的,因为cookie会被重新加载,需要return Redirect("/Home/Index")重定向

            public async Task<IActionResult> LogOut()
            {
                await signManager.SignOutAsync();
                return View();
            }

      4、获取当前登录用户

        var res = await userManager.GetUserAsync(HttpContext.User);

       我的示例。

  • 相关阅读:
    问题描述:判断一个整数 n 是否为 2 的幂次方
    C#的关键字Explicit 和 Implicit
    .NET写入文件操作
    C# Main函数详解
    SpringBoot增加过滤XSS脚本攻击
    Hutool工具包导出Excel文件异常 You need to add dependency of poi-ooxml to your project
    微信H5表单点击输入框提示防欺诈盗号,请勿支付或输入qq密码
    RedisTemplate执行lua脚本在Redis集群模式下报错EvalSha is not supported in cluster environment.
    SpringBoot使用RedisTemplate+Lua脚本实现Redis分布式锁
    SpringBoot使用Thymeleaf打成jar包部署找不到页面
  • 原文地址:https://www.cnblogs.com/xwc1996/p/11789052.html
Copyright © 2011-2022 走看看