查看原文
其他

ASP.NET Core 的用户注册功能:Identity上手

DotNet 2019-08-03

(给DotNet加星标,提升.Net技能


转自:不咬人的蚊子

cnblogs.com/oukichi/p/9955791.html


首先请using这个类库


using Microsoft.AspNetCore.Identity;


这个类库老牛逼了,首先是包含了一个IdentityUser类。我们可以自己写一个User类继承IdentityUser,这样一来,很多属性我就不用手动建了。


如你所见,我的User没有Emai这个字段,但是IdentityUser有这个字段。


public class User:IdentityUser
{

   public string Pass { get; set; }

   public string DisplayName { get; set; }

   public DateTime RegisteredTime { get; set; }
}


如何把用户发来的数据变成一个User并且存入数据库?


显然,得先创建并且连接一个数据库。


创建数据库如果使用VSStudio是贼容易的一件事,只需要打开'视图菜单',然后点开'SQL Server对象资源管理器'。然后你就看到下面这个图。


在上面点右键然后添加一个SQL服务器,然后在服务器上点右键查看属性,可以得到链接字符串。





这种简单的操作显然难不住你。下一步把连接字符串放到appsetting.json里面,下面这是一种推荐做法。你当然可以直接粘贴到你的startUp.cs文件中。不过谁会这么做呢?


"ConnectionStrings": {
   "DefaultConnection": "这里就是你的连接字符串"
}


下一步要用这个连接字符串连上你的数据库。注意带颜色的字。


// This method gets called by the runtime. Use this method
//to add services to the container.

public void ConfigureServices(IServiceCollection services)
{
   services.Configure<CookiePolicyOptions>(options =>
   {
       // This lambda determines whether user consent for
      //non-essential cookies is needed for a given request.

       options.CheckConsentNeeded = context => true;
       options.MinimumSameSitePolicy = SameSiteMode.None;
   });

  // 看到了么,下面这行代码用来连接数据库。这是EF提供的方法。
   services.AddDbContext<AppContext>(options =>
   options.UseSqlServer
   (Configuration.GetConnectionString("DefaultConnection")));
  // 在这里指定你的User类,然后再指定你的数据库。
   //这是Identity类库提供的方法。

   services.AddDefaultIdentity<User>()
   .AddEntityFrameworkStores<AppContext>();
   services.AddMvc()
   .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}


public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
   if (env.IsDevelopment())
   {
       app.UseDeveloperExceptionPage();
   }
   else
   {
       app.UseExceptionHandler("/Error");
       app.UseHsts();
   }

   app.UseHttpsRedirection();
   app.UseStaticFiles();
   app.UseCookiePolicy();
  // 这里必须用上。
   app.UseAuthentication();
   app.UseMvc();
}


经过上面的配置,controller里面就可以注入很多方法。这下你看起来牛逼多了。


数据库连上了,接下来是真枪实弹的创建一个用户,是时候写controller了


建一个随便什么controller吧。我建的是UserController,你可以随你的便。关我屌事呢?


在controller的构造函数里面注入一个UserManager的类,这个类也是Identity提供的。


public class UserController : ControllerBase
{
       private readonly UserManager<User> _userManager;
       public UserController(UserManager<User> userManager)
       
{
           _userManager = userManager;
       }
......


这个UserManager有贼多的方法,这里我只用一个,createAsync方法。


// POST: api/User
[HttpPost]
public async Task PostAsync([FromBody]User _user)
{  

   //先创建一个user,不包括密码
   var user = new User { Email = _user.Email ,
   UserName = _user.UserName};
   //将user和密码绑定入库

   var result = await _userManager.CreateAsync(user, _user.Pass);
   if (result.Succeeded)
   {
       Console.Write("注册成功!");
   }
}


用Postman模拟一个请求。你注意到那个FromBody了吗?这个标记可以把发过来的json请求解析成User格式。



这里有一个新手大坑。如果你的 [FromBody] User _user这里写的是[FromBody] string _user, 你就不能用json格式发。会报什么json解析错误。


发送请求以后去看看你的数据库吧。已经创建好了一个User对象并且存到了你的数据库里。

 


这么多字段都是来自IdentityUser类,其中只有那个pass字段是我自己UserClass里面的。


最后补充【关于Migration】:


如果你报500错误,说什么表名无效的话。你需要做一下Migration。说白了就是:让数据库的表结构和你代码的Model结构相同。


比如你现在有了一个UserModel,可是数据库没有User这个表。


怎么Migration?


简单


这是创建一个名为“InitialCreate”的Migration

如果你用的是powershell

Add-Migration InitialCreate

如果你用的是console

dotnet ef migrations add InitialCreate

然后更新数据库

>powershell

Add-Migration InitialCreate

>console

dotnet ef migrations add InitialCreate


推荐阅读

(点击标题可跳转阅读)

C# 8.0 新特性

.NET Core 开发者的福音之玩转Redis 神器推荐

快速开发跨平台应用之Xamarin技术


看完本文有收获?请转发分享给更多人

关注「DotNet」加星标,提升.Net技能 

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存