Учетные записи создаются в AccountController.cs, администратор создается в RoleInitializer.cs. Этот контроллер является примером возникновения ошибки UsersController.cs:
Возникла проблема с аутентификацией, которую решили здесь. Сейчас возникла проблема с авторизацией, если я задаю параметр Роли, то получаю ошибку. [code]Program.cs: namespace MySteamDBMetacritic { public class Program { public static async Task Main(string[] args) { var builder = WebApplication.CreateBuilder(args); builder.Services.AddDbContext((options) => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
app.Run(); } } } [/code] Учетные записи создаются в AccountController.cs, администратор создается в RoleInitializer.cs. Этот контроллер является примером возникновения ошибки UsersController.cs: [code]using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using MySteamDBMetacritic.Models; using MySteamDBMetacritic.ViewModels;
namespace MySteamDBMetacritic.Controllers { [Authorize(Roles = "Admin")] public class UsersController : Controller { UserManager _userManager;
public UsersController(UserManager userManager) { _userManager = userManager; }
public IActionResult Index() => View(_userManager.Users.ToList());
public IActionResult Create() => View();
[HttpPost] public async Task Create(CreateUserViewModel model) { if (ModelState.IsValid) { User user = new User { Email = model.Email, UserName = model.UserName }; var result = await _userManager.CreateAsync(user, model.Password); if (result.Succeeded) { return RedirectToAction("Index"); } else { foreach (var error in result.Errors) { ModelState.AddModelError(string.Empty, error.Description); } } } return View(model); }
public async Task Edit(int id) { User user = await _userManager.FindByIdAsync(id.ToString());
if (user == null) { return NotFound(); }
EditUserViewModel model = new EditUserViewModel { Id = user.Id, Email = user.Email, UserName = user.UserName };
return View(model); }
[HttpPost] public async Task Edit(EditUserViewModel model) { if (ModelState.IsValid) { User user = await _userManager.FindByIdAsync(model.Id.ToString());
[HttpGet] public IActionResult Register() { return View(); }
[HttpPost] public async Task Register([FromBody]RegisterViewModel model) { if (ModelState.IsValid) { User user = new User { Email = model.Email, UserName = model.UserName };
[HttpPost] public async Task Login([FromBody]LoginViewModel model) { if (ModelState.IsValid) { var result = await _signInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberMe, false);
public async Task ChangePassword(int id) { User user = await _userManager.FindByIdAsync(id.ToString());
if (user == null) { return NotFound(); }
ChangePasswordViewModel model = new ChangePasswordViewModel { Id = user.Id, Email = user.Email };
return View(model); }
[HttpPost] public async Task ChangePassword(ChangePasswordViewModel model) { if (ModelState.IsValid) { User user = await _userManager.FindByIdAsync(model.Id.ToString());
if (user != null) { var _passwordValidator = HttpContext.RequestServices.GetService(typeof(IPasswordValidator)) as IPasswordValidator; var _passwordHasher = HttpContext.RequestServices.GetService(typeof(IPasswordHasher)) as IPasswordHasher;
IdentityResult result = await _passwordValidator.ValidateAsync(_userManager, user, model.NewPassword);
public IActionResult Token(string username, string password) { var identity = GetIdentity(username, password).GetAwaiter().GetResult();
if (identity == null) { return BadRequest(new { errorText = "Invalid username or password." }); }
var now = DateTime.Now;
var jwt = new JwtSecurityToken( issuer: _configuration["Jwt:Issuer"], audience: _configuration["Jwt:Audience"], notBefore: now, claims: identity.Claims, expires: now.Add(TimeSpan.FromMinutes(double.Parse(_configuration["Jwt:ExpiresMinutes"]))), signingCredentials: new SigningCredentials(new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:Key"])), SecurityAlgorithms.HmacSha256)); var encodedJwt = new JwtSecurityTokenHandler().WriteToken(jwt);
var response = new { access_token = encodedJwt, username = identity.Name };
return Json(response); }
private async Task GetIdentity(string username, string password) { User user = await _userManager.FindByNameAsync(username);
if (user != null) { var claims = new List { new Claim(ClaimsIdentity.DefaultNameClaimType, user.UserName), new Claim(ClaimsIdentity.DefaultRoleClaimType, string.Join(',',_userManager.GetRolesAsync(user).Result)) };
ClaimsIdentity claimsIdentity = new ClaimsIdentity(claims, "Token", ClaimsIdentity.DefaultNameClaimType, ClaimsIdentity.DefaultRoleClaimType);
return claimsIdentity; }
return null; } } [/code] Проверил, роль назначена. [code]RoleInitializer[/code], выполнить каждую стартовую программу, GetRoleAsync вернет «Администратор» [code]using Microsoft.AspNetCore.Identity; using MySteamDBMetacritic.Db; using MySteamDBMetacritic.Models;
namespace MySteamDBMetacritic.Classes { public class RoleInitializer { public static async Task InitializeAsync(ApplicationDbContext _context, UserManager userManager, RoleManager roleManager) { string adminEmail = "admin@gmail.com"; string password = "aA12345!";
if (await roleManager.FindByNameAsync("Admin") == null) { await roleManager.CreateAsync(new IdentityRole("Admin")); }
if (await roleManager.FindByNameAsync("User") == null) { await roleManager.CreateAsync(new IdentityRole("User")); }
if (await userManager.FindByNameAsync("Admin") == null) { User admin = new User { Email = adminEmail, UserName = "Admin" }; IdentityResult result = await userManager.CreateAsync(admin, password);
if (result.Succeeded) { await userManager.AddToRoleAsync(admin, "Admin"); } } else { User? admin = await userManager.FindByNameAsync("Admin"); var result = await userManager.GetRolesAsync(admin);
if (!result.Contains("Admin")) { await userManager.AddToRoleAsync(admin, "Admin"); } }
Я сделал провел небольшое исследование и не нашел ничего, что могло бы мне помочь, я просто добавил [code]TokenValidationParameters RoleClaimType = ClaimsIdentity.DefaultRoleClaimType [/code] и мне это не помогло. Когда я создаю токен JWT, все хорошо: [img]https://i.sstatic.net/f9ahZn6t.png[/img] Но когда я проверяю HttpContext, появляется нет утверждения "роли": [img]https://i.sstatic.net/OffVNs18.png[/img]
Возникла проблема с аутентификацией, которую решили здесь. Сейчас возникла проблема с авторизацией, если я задаю параметр Роли, то получаю ошибку.
Program.cs:
namespace MySteamDBMetacritic
{
public class Program
{
public static async Task...
Возникла проблема с аутентификацией, которую решили здесь. Сейчас возникла проблема с авторизацией, если я задаю параметр Роли, то получаю ошибку.
Program.cs:
namespace MySteamDBMetacritic
{
public class Program
{
public static async Task...
У меня есть проект API ASP.Net Core, который работает с базой данных, созданной для проекта ASP.NET MVC (в .NET 4.6) с использованием Asp.Net Identity.
Мой ASP.Net Core Api использует проверку токена JWT для авторизации при вызовах API, но также...
Я изо всех сил пытался настроить и совместить аутентификацию с помощью Google, а также генерировать токены JWT в моем приложении и отправлять их клиенту. Тогда клиент авторизуется с использованием этих токенов.
Я уже правильно реализовал...
Я изо всех сил пытался настроить и совместить аутентификацию с помощью Google, а также генерировать токены JWT в моем приложении и отправлять их клиенту. Тогда клиент авторизуется с использованием этих токенов.
Я уже правильно реализовал...