在ASP.NET Core WebAPI控制器中,带有角色的Authorize属性不起作用。

huangapple go评论107阅读模式
英文:

The Authorize attribute in ASP.NET Core WebAPI controller with the Roles is not work

问题

I tried using [Authorize(Roles="role")] on my controller, but it doesn't work. Later, I checked using IsInRole to confirm if the role was successfully added, but it always shows false.

However, I found an article that had previously addressed this problem, so I tried the suggested solution, but it still didn't work.

我尝试在我的控制器上使用 [Authorize(Roles="role")],但它不起作用。后来,我使用 IsInRole 来确认角色是否成功添加,但它总是显示为false。

然而,我找到了一篇先前解决这个问题的文章,所以我尝试了建议的解决方案,但它仍然不起作用。

Link to the Stack Overflow article

我希望你帮我查找代码中的任何问题。

user.IsInRole("Developer") 返回 false,但 _userManager.IsInRoleAsync(user1, "Developer") 返回 true

  1. var user = HttpContext.User;
  2. var ss = user.IsInRole("Developer"); // 返回 false
  3. var user1 = await _userManager.Users.FirstOrDefaultAsync(x => x.UserName == User.FindFirstValue(ClaimTypes.Name));
  4. var sss = await _userManager.IsInRoleAsync(user1, "Developer"); // 返回 true

这是我的用户注册过程。

  1. if (await _userManager.Users.AnyAsync(x => x.UserName == registerDto.Username))
  2. {
  3. ModelState.AddModelError("username", "Username taken");
  4. return ValidationProblem();
  5. }
  6. var user = new AppUser
  7. {
  8. DisplayName = registerDto.DisplayName,
  9. UserName = registerDto.Username
  10. };
  11. var role = registerDto.Role;
  12. if (await _roleManager.RoleExistsAsync(role))
  13. {
  14. var result = await _userManager.CreateAsync(user, registerDto.Password);
  15. if (result.Succeeded == false)
  16. {
  17. return BadRequest(result.Errors);
  18. }
  19. await _userManager.AddToRoleAsync(user, role);
  20. return await CreateUserObject(user);
  21. }
  22. return BadRequest($"Role {role} not found");

更新:
这是 AspNetRoles 表。
在ASP.NET Core WebAPI控制器中,带有角色的Authorize属性不起作用。

更新2:
我的其他设置。

  1. services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
  2. .AddJwtBearer(opt =>
  3. {
  4. opt.TokenValidationParameters = new TokenValidationParameters
  5. {
  6. ValidateIssuerSigningKey = true,
  7. IssuerSigningKey = key,
  8. ValidateIssuer = false,
  9. ValidateAudience = false
  10. };
  11. opt.Events = new JwtBearerEvents
  12. {
  13. OnMessageReceived = context =>
  14. {
  15. var accessToken = context.Request.Query["access_token"];
  16. var path = context.HttpContext.Request.Path;
  17. if (!string.IsNullOrEmpty(accessToken) &&
  18. HubPath.CheckStartsWithSegments(path))
  19. {
  20. context.Token = accessToken;
  21. }
  22. return Task.CompletedTask;
  23. }
  24. };
  25. });
  1. builder.Services.AddControllers(opt =>
  2. {
  3. var policy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();
  4. opt.Filters.Add(new AuthorizeFilter(policy));
  5. });
英文:

I tried using [Authorize(Roles="role")] on my controller, but it doesn't work. Later, I checked using IsInRole to confirm if the role was successfully added, but it always shows false.

However, I found an article that had previously addressed this problem, so I tried the suggested solution, but it still didn't work.

https://stackoverflow.com/questions/53271496/asp-net-core-identity-2-user-isinrole-always-returns-false

I would like you to help me identify any issues in my code.

user.IsInRole("Developer") is return false, but _userManager.IsInRoleAsync(user1, "Developer") is return ture.

  1. var user = HttpContext.User;
  2. var ss = user.IsInRole("Developer"); // return false
  3. var user1 = await _userManager.Users
  4. .FirstOrDefaultAsync(x => x.UserName == User.FindFirstValue(ClaimTypes.Name));
  5. var sss = await _userManager.IsInRoleAsync(user1, "Developer"); // return true
  1. services.AddIdentityCore<AppUser>(opt =>
  2. {
  3. opt.Password.RequireDigit = false;
  4. opt.Password.RequiredLength = 0;
  5. opt.Password.RequireLowercase = false;
  6. opt.Password.RequireUppercase = false;
  7. opt.Password.RequireNonAlphanumeric = false;
  8. opt.User.RequireUniqueEmail = false;
  9. })
  10. .AddRoles<IdentityRole>()
  11. .AddEntityFrameworkStores<DataContext>();
  12. services.AddScoped<IUserClaimsPrincipalFactory<AppUser>,UserClaimsPrincipalFactory<AppUser, IdentityRole>>();

Here is my user registration process.

  1. if (await _userManager.Users.AnyAsync(x => x.UserName == registerDto.Username))
  2. {
  3. ModelState.AddModelError("username", "Username taken");
  4. return ValidationProblem();
  5. }
  6. var user = new AppUser
  7. {
  8. DisplayName = registerDto.DisplayName,
  9. UserName = registerDto.Username
  10. };
  11. var role = registerDto.Role;
  12. if (await _roleManager.RoleExistsAsync(role))
  13. {
  14. var result = await _userManager.CreateAsync(user, registerDto.Password);
  15. if (result.Succeeded == false)
  16. {
  17. return BadRequest(result.Errors);
  18. }
  19. await _userManager.AddToRoleAsync(user, role);
  20. return await CreateUserObject(user);
  21. }
  22. return BadRequest($"Role {role} not found");

Updete:
It's AspNetRoles table.
在ASP.NET Core WebAPI控制器中,带有角色的Authorize属性不起作用。

Update 2:
My others setting.

  1. services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
  2. .AddJwtBearer(opt =>
  3. {
  4. opt.TokenValidationParameters = new TokenValidationParameters
  5. {
  6. ValidateIssuerSigningKey = true,
  7. IssuerSigningKey = key,
  8. ValidateIssuer = false,
  9. ValidateAudience = false
  10. };
  11. opt.Events = new JwtBearerEvents
  12. {
  13. OnMessageReceived = context =>
  14. {
  15. var accessToken = context.Request.Query["access_token"];
  16. var path = context.HttpContext.Request.Path;
  17. if (!string.IsNullOrEmpty(accessToken) &&
  18. HubPath.CheckStartsWithSegments(path))
  19. {
  20. context.Token = accessToken;
  21. }
  22. return Task.CompletedTask;
  23. }
  24. };
  25. });
  1. builder.Services.AddControllers(opt =>
  2. {
  3. var policy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();
  4. opt.Filters.Add(new AuthorizeFilter(policy));
  5. });

答案1

得分: 1

以下是代码的中文翻译部分:

AspNetIdentityDbContext.cs

  1. public class AspNetIdentityDbContext : IdentityDbContext<IdentityUser>
  2. {
  3. protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
  4. {
  5. optionsBuilder.UseMySql("server=192.168.2.68;database=wa99UserAuth;user=mysql1;password=Q!q11111", new MySqlServerVersion(new Version()));
  6. }
  7. }

program.cs

  1. builder.Services.AddDbContext<AspNetIdentityDbContext>();
  2. builder.Services.AddIdentity<IdentityUser, IdentityRole>()
  3. .AddEntityFrameworkStores<AspNetIdentityDbContext>();

controller

  1. [ApiController]
  2. public class ValuesController : ControllerBase
  3. {
  4. private readonly UserManager<IdentityUser> _userManager;
  5. private readonly RoleManager<IdentityRole> _roleManager;
  6. private readonly SignInManager<IdentityUser> _signInManager;
  7. public ValuesController(UserManager<IdentityUser> userManager, RoleManager<IdentityRole> roleManager, SignInManager<IdentityUser> signInManager)
  8. {
  9. this._userManager = userManager;
  10. this._roleManager = roleManager;
  11. this._signInManager = signInManager;
  12. }
  13. [HttpPost("AddRole")]
  14. public async Task<string> AddRole(string role)
  15. {
  16. var role2 = new IdentityRole { Name = role };
  17. var result = await _roleManager.CreateAsync(role2);
  18. if (result.Succeeded)
  19. {
  20. return "成功";
  21. }
  22. else
  23. {
  24. return "错误";
  25. }
  26. }
  27. [HttpPost("register")]
  28. public async Task<string> register(string username, string password, string role)
  29. {
  30. var user = new IdentityUser
  31. {
  32. UserName = username
  33. };
  34. if (await _roleManager.RoleExistsAsync(role))
  35. {
  36. var result = await _userManager.CreateAsync(user, password);
  37. if (result.Succeeded)
  38. {
  39. await _userManager.AddToRoleAsync(user, role);
  40. return "成功";
  41. }
  42. else
  43. {
  44. return "错误";
  45. }
  46. }
  47. else
  48. {
  49. return "错误";
  50. }
  51. }
  52. [HttpPost("login")]
  53. public async Task<string> login(string username, string password)
  54. {
  55. var result = await _signInManager.PasswordSignInAsync(username, password, true, false);
  56. if (result.Succeeded)
  57. {
  58. return "成功";
  59. }
  60. else
  61. {
  62. return "错误";
  63. }
  64. }
  65. [Authorize(Roles = "Developer")]
  66. [HttpGet("test")]
  67. public async Task test()
  68. {
  69. var user = HttpContext.User;
  70. var ss = user.IsInRole("Developer");
  71. var user1 = await _userManager.Users.FirstOrDefaultAsync(x => x.UserName == "user1");
  72. var sss = await _userManager.IsInRoleAsync(user1, "Developer");
  73. }
  74. }

测试:

  1. 添加一个名为"Developer"的角色
  2. 注册一个用户"testUser",密码为"Q@q11111",角色为"Developer"
  3. 登录该用户
  4. 运行测试,ss为true
英文:

You can try the following code for a test.(.net6 api project)<br>
AspNetIdentityDbContext.cs

  1. public class AspNetIdentityDbContext : IdentityDbContext&lt;IdentityUser&gt;
  2. {
  3. protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
  4. {
  5. optionsBuilder.UseMySql(&quot;server=192.168.2.68;database=wa99UserAuth;user=mysql1;password=Q!q11111&quot;, new MySqlServerVersion(new Version()));
  6. }
  7. }

program.cs

  1. builder.Services.AddDbContext&lt;AspNetIdentityDbContext&gt;();
  2. builder.Services.AddIdentity&lt;IdentityUser, IdentityRole&gt;()
  3. .AddEntityFrameworkStores&lt;AspNetIdentityDbContext&gt;();

controller

  1. [ApiController]
  2. public class ValuesController : ControllerBase
  3. {
  4. private readonly UserManager&lt;IdentityUser&gt; _userManager;
  5. private readonly RoleManager&lt;IdentityRole&gt; _roleManager;
  6. private readonly SignInManager&lt;IdentityUser&gt; _signInManager;
  7. public ValuesController(UserManager&lt;IdentityUser&gt; userManager,RoleManager&lt;IdentityRole&gt; roleManager,SignInManager&lt;IdentityUser&gt; signInManager)
  8. {
  9. this._userManager = userManager;
  10. this._roleManager = roleManager;
  11. this._signInManager = signInManager;
  12. }
  13. [HttpPost(&quot;AddRole&quot;)]
  14. public async Task&lt;string&gt; AddRole(string role)
  15. {
  16. var role2 = new IdentityRole { Name = role };
  17. var result = await _roleManager.CreateAsync(role2);
  18. if (result.Succeeded)
  19. {
  20. return &quot;Succeed&quot;;
  21. }
  22. else
  23. {
  24. return &quot;Error&quot;;
  25. }
  26. }
  27. [HttpPost(&quot;register&quot;)]
  28. public async Task&lt;string&gt; register(string username,string password,string role)
  29. {
  30. var user = new IdentityUser
  31. {
  32. UserName = username
  33. };
  34. if (await _roleManager.RoleExistsAsync(role))
  35. {
  36. var result = await _userManager.CreateAsync(user, password);
  37. if (result.Succeeded)
  38. {
  39. await _userManager.AddToRoleAsync(user, role);
  40. return &quot;Succeed&quot;;
  41. }
  42. else
  43. {
  44. return &quot;Error&quot;;
  45. }
  46. }
  47. else
  48. {
  49. return &quot;Error&quot;;
  50. }
  51. }
  52. [HttpPost(&quot;login&quot;)]
  53. public async Task&lt;string&gt; login(string username,string password)
  54. {
  55. var result = await _signInManager.PasswordSignInAsync(username, password, true, false);
  56. if (result.Succeeded)
  57. {
  58. return &quot;Succeed&quot;;
  59. }
  60. else
  61. {
  62. return &quot;Error&quot;;
  63. }
  64. }
  65. [Authorize(Roles = &quot;Developer&quot;)]
  66. [HttpGet(&quot;test&quot;)]
  67. public async Task test()
  68. {
  69. var user = HttpContext.User;
  70. var ss = user.IsInRole(&quot;Developer&quot;);
  71. var user1 = await _userManager.Users.FirstOrDefaultAsync(x =&gt; x.UserName == &quot;user1&quot;);
  72. var sss = await _userManager.IsInRoleAsync(user1, &quot;Developer&quot;);
  73. }
  74. }

Test:<br>
1.Add a role name "Developer"<br>
在ASP.NET Core WebAPI控制器中,带有角色的Authorize属性不起作用。<br>
2.Register a user "testUser" password "Q@q11111" with role "Developer"<br>
在ASP.NET Core WebAPI控制器中,带有角色的Authorize属性不起作用。<br>
3.Signin the user<br>
在ASP.NET Core WebAPI控制器中,带有角色的Authorize属性不起作用。<br>
4.Run test ,ss is true
在ASP.NET Core WebAPI控制器中,带有角色的Authorize属性不起作用。

huangapple
  • 本文由 发表于 2023年6月8日 15:13:55
  • 转载请务必保留本文链接:https://go.coder-hub.com/76429429.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定