public class AuthController : Controller
{
SignInManager<AppUser> _signInManager { get; }
UserManager<AppUser> _userManager { get; }
RoleManager<IdentityRole> _roleManager { get; }
public AuthController(SignInManager<AppUser> signInManager,
UserManager<AppUser> userManager,
RoleManager<IdentityRole> roleManager)
{
_signInManager = signInManager;
_userManager = userManager;
_roleManager = roleManager;
}
public IActionResult Login()
{
return View();
}
[HttpPost]
public async Task<IActionResult> Login(string? returnUrl,LoginVM vm)
{
AppUser user;
if (!ModelState.IsValid)
{
return View(vm);
}
if (vm.UsernameOrEmail.Contains("@"))
{
user = await _userManager.FindByEmailAsync(vm.UsernameOrEmail);
}
else
{
user = await _userManager.FindByNameAsync(vm.UsernameOrEmail);
}
if (user == null)
{
ModelState.AddModelError("", "Username or password is wrong");
return View(vm);
}
var result = await _signInManager.PasswordSignInAsync(user, vm.Password, vm.IsRemember, true);
if (!result.Succeeded)
{
if (result.IsLockedOut)
{
ModelState.AddModelError("", "Too many attempts wait until " + DateTime.Parse(user.LockoutEnd.ToString()).ToString("HH:mm"));
}
else
{
ModelState.AddModelError("", "Username or password is wrong");
}
return View(vm);
}
if (returnUrl != null)
{
return LocalRedirect(returnUrl);
}
return RedirectToAction("Index","Home");
}
public IActionResult Register()
{
return View();
}
[HttpPost]
public async Task<IActionResult> Register(RegisterVM vm)
{
if (!ModelState.IsValid)
{
return View(vm);
}
var user = new AppUser
{
Fullname = vm.Fullname,
Email = vm.Email,
UserName = vm.Username
};
var result = await _userManager.CreateAsync(user, vm.Password);
if (!result.Succeeded)
{
foreach (var error in result.Errors)
{
ModelState.AddModelError("", error.Description);
}
return View(vm);
}
var roleResult = await _userManager.AddToRoleAsync(user, Roles.Member.ToString());
if (!roleResult.Succeeded)
{
ModelState.AddModelError("", "Something went wrong. Please contact admin");
return View(vm);
}
return View();
}
public async Task<IActionResult> Logout()
{
await _signInManager.SignOutAsync();
return RedirectToAction("Index", "Home");
}
public async Task<bool> CreateRoles()
{
foreach (var item in Enum.GetValues(typeof(Roles)))
{
if (!await _roleManager.RoleExistsAsync(item.ToString()))
{
var result = await _roleManager.CreateAsync(new IdentityRole
{
Name = item.ToString()
});
if (!result.Succeeded)
{
return false;
}
}
}
return true;
}
}
}
所以,我在代码中搞乱了登录、注册和注销,现在这个 RoleManager 的事情让我摸不着头脑。我只是想为我的管理员用户提供一些额外的权力,但我有点不知道该怎么做。如果您能用简单的语言解释步骤或需要进行哪些更改来帮助我,那就太棒了。
我的目标是让管理员用户在我的系统中体验更好,您对此的建议非常有用。尝试了解 RoleManager 的事情以及如何为我的管理员用户提供更多能力。您直接的帮助可能会对我解决这个问题产生很大的影响!
定义管理员角色
创建管理员用户
更新注册流程:
var roleResult =等待_userManager.AddToRoleAsync(用户,vm.IsAdmin? Roles.Admin.ToString() : Roles.Member.ToString());
使用管理员角色:
[授权(角色=“管理员”)] 公共 IActionResult AdminDashboard() { // 特定于管理的逻辑 } 5.提升管理能力:
if (User.IsInRole("管理员")) { // 特定于管理的逻辑 }
中间件配置:
services.AddIdentity
公共无效配置(IApplicationBuilder 应用程序,IHostingEnvironment env) { // 其他中间件配置
// Create roles during application startup
var authController = new AuthController(/* inject your dependencies here */);
authController.CreateRoles().GetAwaiter().GetResult();
}