文章目录
前言
使用.net core mvc 的时候要给用户身份时,发现网上没有比较基础的教程。这里我已经使用了Identity里的个人身份验证,vs会自动生成一个登录界面,对于我们这种初学者来说要修改需要一定的时间,希望这篇文章可以给你帮助
一、将登录界面弄出来
因为.net使用了ids4,所以好多东西是已经封装好的,这样子我们就不太容易修改。
1.添加新的项目
2.选择标识
3.根据需求,选择相应的界面,这里我就选择登录和注册
二、添加身份
1.在SeedData里去添加身份
public static async Task InitializeAsync(
IServiceProvider services)
{
var roleManager = services
.GetRequiredService<RoleManager<IdentityRole>>();
await EnsureRolesAsync(roleManager);
var roleManager1 = services
.GetRequiredService<RoleManager<IdentityRole>>();
await RegularUserAsync(roleManager1);
var userManager = services
.GetRequiredService<UserManager<IdentityUser>>();
await EnsureTestAdminAsync(userManager);
}
/// <summary>
/// 添加超级用户
/// </summary>
/// <param name="roleManager"></param>
/// <returns></returns>
private static async Task EnsureRolesAsync(
RoleManager<IdentityRole> roleManager)
{
var alreadyExists = await roleManager
.RoleExistsAsync(Models.Constants.AdministratorRole);
if (alreadyExists) return;
await roleManager.CreateAsync(
new IdentityRole(Models.Constants.AdministratorRole));
}
/// <summary>
/// 添加普通用户
/// </summary>
/// <param name="roleManager"></param>
/// <returns></returns>
private static async Task RegularUserAsync(
RoleManager<IdentityRole> roleManager)
{
var alreadyExists = await roleManager
.RoleExistsAsync(Models.Constants.RegularUsers);
if (alreadyExists) return;
await roleManager.CreateAsync(
new IdentityRole(Models.Constants.RegularUsers));
}
/// <summary>
/// 添加超级管理员的用户
/// </summary>
/// <param name="userManager"></param>
/// <returns></returns>
private static async Task EnsureTestAdminAsync(
UserManager<IdentityUser> userManager)
{
var testAdmin = await userManager.Users
.Where(x => x.UserName == "admin@todo.local")
.SingleOrDefaultAsync();
if (testAdmin != null) return;
testAdmin = new IdentityUser
{
UserName = "admin@todo.local",
Email = "admin@todo.local",
EmailConfirmed = true
};
await userManager.CreateAsync(
testAdmin, "NotSecure123!!");
await userManager.AddToRoleAsync(
testAdmin, Models.Constants.AdministratorRole);
}
2。置顶语句里调用
using (var scope = app.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
SeedData.InitializeAsync(services).Wait();
}
catch (Exception ex)
{
var logger = services
.GetRequiredService<ILogger<Program>>();
logger.LogError(ex, "Error occurred seeding the DB.");
}
}
三、在新建用户的时候给用户身份
1.在Register.cshtml.cs里添加用户身份
//放在大约123行
await _userManager.AddToRoleAsync(
user, Models.Constants.RegularUsers);
四、写用户管理界面
1.在model里面添加用户信息
using Microsoft.AspNetCore.Identity;
using System.ComponentModel.DataAnnotations;
namespace web_net.Models
{
/// <summary>
/// 用户身份
/// </summary>
public class ManageUsersViewMode
{
public IdentityUser[] Administrators { get; set; }
[Display(Name = "普通用户")]
public IdentityUser[] RegularUsers { get; set; }
public IdentityUser[] AnchorUsers { get; set; }
public IdentityUser[] Everyone { get; set; }
}
/// <summary>
/// 用户信息
/// </summary>
public class Users
{
public IdentityUser user { get; set; }
public string identity { get; set; }
}
/// <summary>
/// 建立身份时所需的字符串
/// </summary>
public static class Constants
{
public const string AdministratorRole = "Administrator";
public const string RegularUsers = "RegularUsers";
public const string AnchorUsers = "AnchorUsers";
}
}
2.写查界面
@model ManageUsersViewMode
@{
ViewData["Title"] = "Manage users";
Layout = "~/Views/Shared/AdminLTE/_Layout.cshtml";
}
<h2>@ViewData["Title"]</h2>
<table class="table">
<thead>
<tr>
<td>Id</td>
<td>Email</td>
<td>identity</td>
</tr>
</thead>
@foreach (var user in Model.Administrators)
{
<tr>
<td>@user.Id</td>
<td>@user.Email</td>
<td>Administrators</td>
<td>
<a asp-action="Edit" asp-route-id="@user.Id">Edit</a>
</td>
</tr>
}
@foreach (var user in Model.RegularUsers)
{
<tr>
<td>@user.Id</td>
<td>@user.Email</td>
<td>RegularUsers</td>
<td>
<a asp-action="Edit" asp-route-id="@user.Id">Edit</a>
</td>
</tr>
}
</table>
<h3>Everyone</h3>
<table class="table">
<thead>
<tr>
<td>Id</td>
<td>Email</td>
</tr>
</thead>
@foreach (var user in Model.Everyone)
{
<tr>
<td>@user.Id</td>
<td>@user.Email</td>
<td>
<a asp-action="Edit" asp-route-id="@user.Id">Edit</a>
</td>
</tr>
}
</table>
3.写改界面
@model Users
@*
For more information on enabling MVC for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860
*@
@{
}
<h1>Edit</h1>
<h4>Rucksacks</h4>
<hr />
<div class="row">
<div class="col-md-4">
<form asp-action="Edit">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="user.Email" class="control-label"></label>
<input asp-for="user.Email" class="form-control" readonly="readonly"/>
<span asp-validation-for="user.Email" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="identity" class="control-label"></label>
<select asp-for="identity" class="form-control" asp-items="ViewBag.identityid"></select>
<span asp-validation-for="identity" class="text-danger"></span>
</div>
<div class="form-group">
<input type="submit" value="Save" class="btn btn-primary" />
</div>
</form>
</div>
</div>
<div>
<a asp-action="Index">Back to List</a>
</div>
@section Scripts {
@{
await Html.RenderPartialAsync("_ValidationScriptsPartial");
}
}
4.在Controllers中连接数据库
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using web_net.Models;
using System.Data;
using Microsoft.AspNetCore.Mvc.Rendering;
namespace web_net.Controllers
{
[Authorize(Roles = "Administrator")]
public class ManageUsersController : Controller
{
private readonly UserManager<IdentityUser>
_userManager;
private readonly RoleManager<IdentityRole>
_roleManage;
public ManageUsersController(
UserManager<IdentityUser> userManager, RoleManager<IdentityRole> roleManage)
{
_userManager = userManager;
_roleManage = roleManage;
}
public async Task<IActionResult> Index()
{
var admins = (await _userManager
.GetUsersInRoleAsync("Administrator"))
.ToArray();
var regularusers = (await _userManager
.GetUsersInRoleAsync("RegularUsers"))
.ToArray();
var AnchorUsers = (await _userManager
.GetUsersInRoleAsync("AnchorUsers"))
.ToArray();
var everyone = await _userManager.Users
.ToArrayAsync();
var model = new ManageUsersViewMode
{
Administrators = admins,
Everyone = everyone,
RegularUsers = regularusers,
AnchorUsers = AnchorUsers
};
return View(model);
}
public async Task<IActionResult> Edit(string id)
{
var getuser = (await _userManager
.FindByIdAsync(id)
);
var identity = (await _userManager
.GetRolesAsync(getuser)
);
var model = new Users
{
user = getuser,
identity = identity[0]
};
ViewData["identityid"] = new SelectList(_roleManage.Roles, "Name", "Name", await _roleManage.Roles.ToArrayAsync());
return View(model);
}
[HttpPost]
public async Task<IActionResult> Edit(string id, [Bind("user", "identity")] Users users)
{
var getuser = (await _userManager
.FindByIdAsync(id)
);
var identity = (await _userManager
.GetRolesAsync(getuser)
);
try {
await _userManager.RemoveFromRoleAsync(getuser, identity[0]);
await _userManager.AddToRoleAsync(getuser, users.identity);
}
catch (Exception ex) { }
var model = new Users
{
user = getuser,
identity = identity[0]
};
ViewData["identityid"] = new SelectList(_roleManage.Roles, "Name", "Name", await _roleManage.Roles.ToArrayAsync());
return View(model);
}
}
}
5.效果图