【问题标题】:Authorization .net core 2.0授权.net core 2.0
【发布时间】:2017-10-26 18:05:50
【问题描述】:

我在我的 asp.net 核心应用程序中设置了 cookie 身份验证。我有一个登录页面,其中凭据与活动目录匹配。这一切都很好。 现在接下来我想在我的应用程序中实现授权。我有一个用户表以及对他们的权限。例如读写权限。当用户成功通过身份验证后,我想检查这些权限并向他们展示某些功能,同时限制其他权限。例如,为写入权限显示某些下拉菜单,而为读取权限隐藏。

在 .NET Core 中处理此问题的最佳方法是什么。 我已阅读有关添加政策的信息,例如:

services.AddAuthorization(options => {
            options.AddPolicy("Read", policy => 
                      policy.RequireClaim("Read", "MyCLaim"));
 });

然后在我的控制器中:

[Authorize(Policy = "Read")]
public class HomeController : Controller
{

}

我在哪里从我的数据库中获取登录用户的权限以及如何验证用户是否具有这些权限。

不胜感激。

【问题讨论】:

  • 目前推荐的方式是policies。当您认为您需要权限时,请重新考虑是否使用内置身份...它是一个身份服务器,它说明您的电子邮件、电话、年龄、角色是什么。在考虑 Permission 和 UserGroups 时,恕我直言,您可以放弃 Identity ... 推荐阅读:PermissionsAuthentification
  • 将对此进行调查。仅供参考,我将基于 cookie 的身份验证与 Active Directory 一起使用。

标签: asp.net-core authorization asp.net-core-mvc


【解决方案1】:

我在哪里从我的数据库中获取登录用户的权限和 如何验证用户是否拥有这些权限。

在用户通过身份验证后,您会立即收集用户的声明,并将其存储在身份验证 Cookie 中。

例如,SignInAsync 方法。

public async Task SignInAsync(User user, IList<string> roleNames)
{
    var claims = new List<Claim>
    {
        new Claim(ClaimTypes.Sid, user.Id.ToString()),
        new Claim(ClaimTypes.Name, user.UserName),
        new Claim(ClaimTypes.GivenName, user.FirstName),
        new Claim(ClaimTypes.Surname, user.LastName)
    };

    foreach (string roleName in roleNames)
    {
        claims.Add(new Claim(ClaimTypes.Role, roleName));
    }

    var identity = new ClaimsIdentity(claims, "local", "name", "role");
    var principal = new ClaimsPrincipal(identity);

    await _httpContextAccessor.HttpContext.SignInAsync(
      CookieAuthenticationDefaults.AuthenticationScheme, principal);
}

仅供参考:碰巧我将它们存储为角色声明。如果你不想的话,你不必走那条路。

然后您可以验证 Startup.cs 中的策略。

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        ...
        // Set up policies from claims
        // https://leastprivilege.com/2016/08/21/why-does-my-authorize-attribute-not-work/
        services.AddAuthorization(options =>
        {
            options.AddPolicy(Constants.RoleNames.Administrator, policyBuilder =>
            {
                policyBuilder.RequireAuthenticatedUser()
                    .RequireAssertion(context => context.User.HasClaim(
                        ClaimTypes.Role, Constants.RoleNames.Administrator))
                    .Build();
            });
        });
        ...
    }
}

Usage和你描述的一样。

[Authorize(Policy = "Read")]
public class HomeController : Controller
{
    public IActionResult Index()
    {
        return View();
    }
}

【讨论】:

  • 感谢您的意见。几个问题: 1) var claim = new List { } //所以我在这里对我的数据库进行 db 调用并获取已登录的用户权限,例如读/写。 2.) 什么是 IList roleNames。我如何获得这些角色以及它解决了什么目的。我以为我们已经从上述步骤 3 中获得了声明。 [Authorize(Policy = "Read")] 此属性在控制器上。有什么方法可以授权我的应用程序的某些功能。例如,如果用户具有只读角色,则在我的视图中隐藏某些控件。我怎样才能做到这一点。谢谢
  • 1) 是的 2) 您必须了解如何存储用户在您的系统中可以执行的操作。通常,我们通过创建单独的role table 来解决它。 3)让我们尝试使用上述2个步骤使其适用于控制器。然后创建一个关于基于 Policy 隐藏个人控制的新问题。
  • 身份验证后我设置了声明。如果必须,我如何在控制器中更新我的声明。
  • 声明存储在身份验证 cookie 中。因此,如果您需要更新声明,则需要重新创建身份验证 cookie。
  • 谢谢。我刚发现这个。 var user = context.HttpContext.User as ClaimsPrincipal; var identity = user.Identity as ClaimsIdentity; var claim = (from c in user.Claims where c.Type == "MyClaim" select c).Single(); identity.RemoveClaim(claim);以这种方式查找索赔并删除索赔是否可以?
猜你喜欢
  • 2021-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-03
  • 1970-01-01
  • 2018-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多