微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

asp.net core Identity Framework

用到的package

    <packagereference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="6.0.2" />
    <packagereference Include="Microsoft.EntityFrameworkCore.sqlserver" Version="6.0.2" />
    <packagereference Include="Microsoft.EntityFrameworkCore.tools" Version="6.0.2">
        <PrivateAssets>all</PrivateAssets>
        <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </packagereference>

定义User/Role实体类

    public class MyUser : IdentityUser<long>
    {
        public string? WechatAccount { get; set; }
    }

    public class MyRole : IdentityRole<long>
    {
    }

    public class MyDbContext : IdentityDbContext<MyUser, MyRole, long>
    {
        public MyDbContext(DbContextOptions<MyDbContext> options)
            : base(options)
        {

        }
    }

注入identity framework

builder.Services.AddDbContext<MyDbContext>(opt =>
{
    opt.UsesqlServer("Server=.;Database=demo06;Trusted_Connection=True;MultipleActiveResultSets=True");
});
builder.Services.AddDataProtection();
builder.Services.AddIdentityCore<MyUser>(options =>
{
    options.Password.requiredigit = false;
    options.Password.RequireLowercase = false;
    options.Password.RequireUppercase = false;
    options.Password.requiredLength = 4;
    options.Password.RequireNonAlphanumeric = false;
    options.Tokens.PasswordResetTokenProvider = Tokenoptions.DefaultEmailProvider;
    options.Tokens.EmailConfirmationTokenProvider = Tokenoptions.DefaultEmailProvider;
});

IdentityBuilder idBuilder = new IdentityBuilder(typeof(MyUser), typeof(MyRole), builder.Services);
idBuilder.AddEntityFrameworkStores<MyDbContext>()
    .AddDefaultTokenProviders().AddRoleManager<RoleManager<MyRole>>()
    .AddUserManager<UserManager<MyUser>>();

在Controller中使用usermanager/rolemanager实现帐户的操作

    [ApiController]
    [Route("[controller]")]
    public class IdentityController : ControllerBase
    {
        private UserManager<MyUser> UserManager { get; init; }
        private RoleManager<MyRole> RoleManager { get; init; }

        public IdentityController(UserManager<MyUser> userManager, RoleManager<MyRole> roleManager)
        {
            UserManager = userManager;
            RoleManager = roleManager;
        }

        [HttpPost("AddRole")]
        public async Task<ActionResult<string>> AddRole(string roleName)
        {
            if (await RoleManager.RoleExistsAsync(roleName))
                return BadRequest("role already existed");

            MyRole role = new MyRole() { Name = roleName };
            IdentityResult result = await RoleManager.CreateAsync(role);

            if (!result.Succeeded)
                return BadRequest("create role Failed");

            return Ok("ok");
        }

        [HttpPost("AddUser")]
        public async Task<ActionResult<string>> AddUser(string roleName, string userName, string password)
        {
            MyUser user = await UserManager.FindByNameAsync(userName);

            if (user == null)
            {
                user = new MyUser()
                {
                    UserName = userName,
                    Email = $"{userName}@ccc.com",
                    EmailConfirmed = true
                };
                IdentityResult result = await UserManager.CreateAsync(user, password);
                if (!result.Succeeded)
                    return BadRequest("create role Failed");
            }

            MyRole role = await RoleManager.FindByNameAsync(roleName);
            if (role == null)
                return BadRequest("role Could not be found.");

            if (!await UserManager.IsInRoleAsync(user, roleName))
            {
                IdentityResult result = await UserManager.AddToRoleAsync(user, roleName);

                if (!result.Succeeded)
                    return BadRequest("add user to role Failed");
            }

            return Ok("ok");
        }

        [HttpPost("Login")]
        public async Task<ActionResult<string>> Login(string username, string password)
        {
            MyUser user = await UserManager.FindByNameAsync(username);

            if (user == null)
                return NotFound("username or password is wrong");

            if (await UserManager.IsLockedOutAsync(user))
                return BadRequest("user locked out");

            if (await UserManager.CheckPasswordAsync(user, password))
            {
                await UserManager.ResetAccessFailedCountAsync(user);
                return Ok("Success");
            }

            await UserManager.AccessFailedAsync(user);
            return NotFound("username or password is wrong");
        }

        [HttpPost("Forgetpassword")]
        public async Task<ActionResult<string>> Forgetpassword(string username)
        {
            MyUser user = await UserManager.FindByNameAsync(username);

            if (user == null)
                return NotFound("username not found");

            string token = await UserManager.GeneratePasswordResetTokenAsync(user);
            return Ok(token);
        }

        [HttpPost("ResetPassword")]
        public async Task<ActionResult<string>> ResetPassword(string token, string username, string password)
        {
            MyUser user = await UserManager.FindByNameAsync(username);

            if (user == null)
                return NotFound("username not found");

            IdentityResult result = await UserManager.ResetPasswordAsync(user, token, password);
            if (!result.Succeeded)
                return BadRequest("Failed to reset password");

            await UserManager.ResetAccessFailedCountAsync(user);
            return Ok("ok");
        }
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐