如何允许未经授权的用户使用get方法

时间:2018-08-22 11:31:41

标签: c# .net-core jwt

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

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

 }

这与我的Angular前端完美配合。

这里的问题是我只想对授权批注中不允许的用户启用一种get方法。

方法是:

[HttpGet("{id}")]
public async Task<IActionResult> GetUser(int id)

我想允许访问名为“基本用户”的用户吗?

有什么想法吗?

致意,非常感谢您的支持

编辑:

我发现如果我做控制器:

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

 }

我可以将其他端点指定为:

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

它们受到保护,而并非我想要的完全。

3 个答案:

答案 0 :(得分:2)

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

方法A。 扩展Authorize

internal class MinimumAgeAuthorizeAttribute : AuthorizeAttribute
{
    const string POLICY_PREFIX = "MinimumAge";

    public MinimumAgeAuthorizeAttribute(int age) => Age = age;

    // Get or set the Age property by manipulating the underlying Policy property
    public int Age
    {
        get
        {
            if (int.TryParse(Policy.Substring(POLICY_PREFIX.Length), out var age))
            {
                return age;
            }
            return default(int);
        }
        set
        {
            Policy = $"{POLICY_PREFIX}{value.ToString()}";
        }
    }
}

用法:

[MinimumAgeAuthorize(10)]
public IActionResult RequiresMinimumAge10()

方法B。 创建策略并使用[Authorize]属性设置“策略” [Authorize(Policy = "CustomPolicy")]

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();

    services.AddAuthorization(options =>
    {
        options.AddPolicy("AtLeast21", policy =>
            policy.Requirements.Add(new MinimumAgeRequirement(21)));
    });
}

用法:

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

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

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

答案 1 :(得分:0)

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

仅将[Authorize]放在GetUser方法上,以便任何用户都可以调用它。以及[Authorize(Roles = ("Super user,Admin"))]到控制器中的所有其他方法。

答案 2 :(得分:0)

如果您真的不想拆分一个类或将所有属性都放在所有内容上,另一种选择是允许所有人使用该方法,然后自己执行检查。

[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
}