首页 文章

授权.net核心2.0

提问于
浏览
0

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

在.NET Core中处理此问题的最佳方法是什么 . 我读过有关添加政策的内容:

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

然后在我的控制器中:

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

}

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

会很感激投入 .

1 回答

  • 2

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

    在用户通过身份验证后,您将收集用户的声明,并将其存储在身份验证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();
        }
    }
    

相关问题