C# 如何允许非授权用户访问get方法

C# 如何允许非授权用户访问get方法,c#,.net-core,jwt,C#,.net Core,Jwt,我正在开发一个允许用户按角色访问的应用程序。这是由控制器级别的数据注释配置的 [Authorize(Roles = ("Super user,Admin"))] [Route("api/[controller]")] [ApiController] public class UsersController: ControllerBase { } 这与我的角度前端完美配合 这里的问题是,我只想为授权注释中不允许的用户启用一个get方法 方法是: [HttpGet("{id}")]

我正在开发一个允许用户按角色访问的应用程序。这是由控制器级别的数据注释配置的

 [Authorize(Roles = ("Super user,Admin"))]
 [Route("api/[controller]")]
 [ApiController]
 public class UsersController: ControllerBase
 {

 }
这与我的角度前端完美配合

这里的问题是,我只想为授权注释中不允许的用户启用一个get方法

方法是:

[HttpGet("{id}")]
public async Task<IActionResult> GetUser(int id)
我可以指定其他端点:

[Authorize(Roles = ("Super user,Admin"))]

它们是受保护的,而不是我想要的。

您可以将Authorize属性放在控制器的每个方法上,而不是类上。然后分别控制每个方法的授权


只需将
[Authorize]
放在
GetUser
方法上,任何用户都可以调用它。和
[授权(角色=(“超级用户,管理员”)]
到控制器中的所有其他方法。

如果您真的不想拆分一个类或将所有属性放在所有对象上,另一个选项是允许每个人使用该方法,但随后自己执行检查

[HttpGet("{id}")]
[AllowAnonymous]
public async Task<IActionResult> GetUser(int id)
{
  if(!User.IsInRole("Super user") && !User.IsInRole("Admin") && User.Identity.Name != "Basic User")
  {
     return Unauthorized
  }

  Logic from before
}
[HttpGet(“{id}”)]
[异名]
公共异步任务GetUser(int-id)
{
如果(!User.IsInRole(“超级用户”)和&!User.IsInRole(“管理员”)和&User.Identity.Name!=“基本用户”)
{
未经授权返回
}
从前的逻辑
}

实现目标有两种有趣的方法:

方法A.扩展
授权

用法:

[MinimumAgeAuthorize(10)]
public IActionResult RequiresMinimumAge10()
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

[Authorize(Policy = "AtLeast21")]
public class AlcoholPurchaseController : Controller
{
    public IActionResult Login() => View();

    public IActionResult Logout() => View();
}
方法B.创建策略并使用[Authorize]属性设置“策略”
[Authorize(policy=“CustomPolicy”)]

用法:

[MinimumAgeAuthorize(10)]
public IActionResult RequiresMinimumAge10()
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

[Authorize(Policy = "AtLeast21")]
public class AlcoholPurchaseController : Controller
{
    public IActionResult Login() => View();

    public IActionResult Logout() => View();
}

我很困惑。您希望除了名为“基本用户”的用户之外,任何人都不能访问GetUser方法?我希望只允许此终结点访问未在[Authorize(角色=(“超级用户,管理员”)]中命名的另一个用户,类似于[Authorize(角色=(“基本用户,超级用户,管理员”)],而不向每个终结点添加注释。因此,您的GetUser由以下角色访问:超级用户、管理员和用户名:基本用户?您是否尝试将[Authorize(角色=(“基本用户、超级用户、管理员”)]添加到GetUser?是的,这是此控制器中“基本用户”可以访问的唯一方法。不可能有匿名访问true,但我想避免这种情况,因为代码中有很多噪音,我认为这不会引入太多噪音,而且比其他答案中建议的自定义实现简单得多。无论如何,您不应该在一个控制器中有很多方法。否则,可以考虑拆分为多个控制器。
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

[Authorize(Policy = "AtLeast21")]
public class AlcoholPurchaseController : Controller
{
    public IActionResult Login() => View();

    public IActionResult Logout() => View();
}