ASP.NET标识 - 使用角色作为预定义的声明集

时间:2017-02-21 16:43:41

标签: asp.net asp.net-mvc asp.net-identity claims-based-identity

我是ASP.NET身份的新手,但从我所读过的内容来看,我的任务应该随之实现。

我想以一种

的方式结合角色声明
  • 角色用作抽象描述用户在公司中的功能(" admin",&#34 ;销售","支持"等。)
  • 声明用作具体声明,了解其所有者可以执行的操作("创建用户","编辑支持请求&# 34;,"重置密码")
  • 多个声明分配给角色,代表"权限集"这反映了每个角色的权限。
  • 资源受可能需要角色或声明的政策保护

这通常是一种使用ASP.NET身份的可行方法吗?

我在这里找到了一个很有前途的方法:http://benfoster.io/blog/asp-net-identity-role-claims几乎看起来像我需要的基础以及博主使用RoleManager.AddClaimAsync()向角色添加声明的地方。但是,该函数似乎不是2015年2月最新Microsoft.AspNet.Identity.Core Nuget软件包v2.2.1的一部分,而是在此实现:https://github.com/aspnet/Identity/blob/master/src/Microsoft.AspNetCore.Identity/RoleManager.cs 我在这里混合什么吗?

1 个答案:

答案 0 :(得分:3)

当您查看 System.Security.Claims.ClaimTypes 时,Role是ClaimTypes之一。基本上,Role是Claim的子集。

这完全取决于您打算如何使用它们。如果您使用默认 授权 过滤器,则需要将其添加为 ClaimTypes.Role 。请查看以下示例中的claims.Add(new Claim(ClaimTypes.Role, roleName));

public class CustomAuthenticationService
{
    private readonly HttpContextBase _context;
    private const string AuthenticationType = "ApplicationCookie";

    public CustomAuthenticationService(HttpContextBase context)
    {
        _context = context;
    }

    public void SignIn(User user, IList<string> roleNames)
    {
        IList<Claim> 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));
        }

        ClaimsIdentity identity = new ClaimsIdentity(claims, AuthenticationType);

        IOwinContext context = _context.Request.GetOwinContext();
        IAuthenticationManager authenticationManager = context.Authentication;

        authenticationManager.SignIn(identity);
    }

    public void SignOut()
    {
        IOwinContext context = _context.Request.GetOwinContext();
        IAuthenticationManager authenticationManager = context.Authentication;

        authenticationManager.SignOut(AuthenticationType);
    }
}

意见

个人不喜欢创建自定义声明名称,例如“创建用户”,“编辑支持请求”,“重置密码”。

相反,我会将它们保留为User-CreateUser-EditUser-Delete等角色,以便我可以使用授权属性。