使用.net自动生成的登录界面,并添加身份


前言

使用.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.效果图

在这里插入图片描述
在这里插入图片描述


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值