Programming C#

Asp Net Core 7 Identity

Create Project Web MVC Empty

dotnet new web -o WebApp

Install Identity

dotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCore

Install Entity Framework Core Sql Server

dotnet add package Microsoft.EntityFrameworkCore.SqlServer

Install Entity Framework Core Design

dotnet add package Microsoft.EntityFrameworkCore.Design

Create Database Context

public class DatabaseContext : IdentityDbContext{
    public DatabaseContext(DbContextOptions options):base(options){}
}

Register Database Context

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<DatabaseContext<(p => 
	p.UseSqlServer(builder.Configuration.GetConnectionString("Store")));
builder.Services.AddIdentity<IdentityUser, IdentityRole>()
	.AddEntityFrameworkStores<DatabaseContext>().AddDefaultTokenProviders();

Configuration Constraint Password

builder.Services.Configure<IdentityOptions>(p => {
	p.Password.RequireDigit = false;
	p.Password.RequiredLength = 3;
	p.Password.RequireLowercase = false;
	p.Password.RequireNonAlphanumeric = false;
	p.Password.RequireUppercase = false;
	p.Password.RequiredUniqueChars = 1;
});

Generate Table Identity

Install tool dotnet-ef

dotnet tool install --global dotnet-ef

Generate table

dotnet ef migrations add InitialCreate --context DatabaseContext
dotnet ef database update --context DatabaseContext

Create class UserRepository

class UserRepository{
	readonly UserManager<IdentityUser> manager;
	public UserRepository(UserManager<IdentityUser> manager){
		this.manager = manager;
	}
}

Create method Add User in class UserRepository

public async Task<IdentityResult> Add(RegisterModel obj){
	var user = new IdentityUser{
		UserName = obj.UserName,
		Email = obj.Email,
		PhoneNumber = obj.Phone
	};
	return await manager.CreateAsync(user, obj.Password);
}

Create method Login in class UserRepository

public async Task<IdentityUser?> Login(LoginModel obj){
	var user = await manager.FindByNameAsync(obj. U);
	if(user != null){
		if(await manager.CheckPasswordAsync(user, obj.P)){
			return user;
		}
	}
	return null;
}

Generate two Factor Token

public async Task<string> GenerateTwoFactorToken(IdentityUser obj, string provider){
	return await manager.GenerateTwoFactorTokenAsync(obj,  provider);
}

Confirm Two Factor Token

public async Task<bool> ConfirmTwoFactorToken(TwoFactor obj){
	var user = await manager.FindByIdAsync(obj.Id);
	if(user != null){
		return await manager.VerifyTwoFactorTokenAsync(user, obj.Provider, obj.Token);
	}
	return false;
}

Generate Password Reset Token

public async Task<ResetPassword?> GeneratePasswordResetToken(string email){
	IdentityUser? user = await manager.FindByEmailAsync(email);
	if(user != null){
		return new ResetPassword{ 
			Token = HttpUtility.UrlEncode(await manager.GeneratePasswordResetTokenAsync(user)),
			 Id = user.Id
		};
	}
	return null;
}

Reset Password

public async Task<IdentityResult?> ResetPassword(ResetPassword obj){
	IdentityUser? user = await manager.FindByIdAsync(obj.Id);
	if(user != null){
		return await manager.ResetPasswordAsync(user, HttpUtility.UrlEncode(obj.Token), obj.Password);
	}
	return null;
}