专栏首页晓晨的专栏IdentityServer Topics(2)- 定义资源

IdentityServer Topics(2)- 定义资源

您通常在系统设计中的第一件事就是您要保护的资源。 这可能是您的用户的身份信息,如个人资料数据或电子邮件地址,或访问API。

您可以使用C#对象模型定义资源(硬编码),或从数据存储中加载它们。 IResourceStore的实现处理这些低级细节。 本文使用的是in-memory的实现。

定义身份资源

身份资源也是数据,如用户ID,姓名或用户的电子邮件地址。 身份资源具有唯一的名称,您可以为其分配任意身份信息单元(比如姓名、性别、身份证号和有效期等都是身份证的身份信息单元)类型。 这些身份信息单元将被包含在用户的身份标识(Id Token)中。 客户端将使用scope参数来请求访问身份资源。

OpenID Connect规范指定了一对标准的身份资源。 最低要求是,您提供支持为您的用户颁发一个唯一的ID - 也称为subject id(sid)。 这是通过暴露称为openid的标准身份资源完成的:

public static IEnumerable<IdentityResource> GetIdentityResources()
{
    return new List<IdentityResource>
    {
        new IdentityResources.OpenId()
    };
}

IdentityResources类支持定义规范中的所有作用域(scope)(openid,email,profile,电话和地址)。 如果您想全部支持,可以将它们添加到支持的身份资源列表中:

public static IEnumerable<IdentityResource> GetIdentityResources()
{
    return new List<IdentityResource>
    {
        new IdentityResources.OpenId(),
        new IdentityResources.Email(),
        new IdentityResources.Profile(),
        new IdentityResources.Phone(),
        new IdentityResources.Address()
    };
}

定义自定义身份资源

您还可以定义自定义身份资源。 创建一个新的IdentityResource类,为其指定一个名称和一个可选的显示名称和描述,并在请求此资源时定义哪个用户身份单元应该包含在身份令牌(Id Token)中:

public static IEnumerable<IdentityResource> GetIdentityResources()
{
    var customProfile = new IdentityResource(
        name: "custom.profile",
        displayName: "Custom profile",
        claimTypes: new[] { "name", "email", "status" });

    return new List<IdentityResource>
    {
        new IdentityResources.OpenId(),
        new IdentityResources.Profile(),
        customProfile
    };
}

定义API资源

为了允许客户请求API的访问令牌,您需要定义API资源,例如:

要访问API的令牌,还需要为其注册作用域(Scope)。 这次作用域类型是Resource类型的:

public static IEnumerable<ApiResource> GetApis()
{
    return new[]
    {
        // simple API with a single scope (in this case the scope name is the same as the api name)
        new ApiResource("api1", "Some API 1"),

        // expanded version if more control is needed
        new ApiResource
        {
            Name = "api2",

            // secret for using introspection endpoint
            ApiSecrets =
            {
                new Secret("secret".Sha256())
            },

            // include the following using claims in access token (in addition to subject id)
            UserClaims = { JwtClaimTypes.Name, JwtClaimTypes.Email },

            // this API defines two scopes
            Scopes =
            {
                new Scope()
                {
                    Name = "api2.full_access",
                    DisplayName = "Full access to API 2",
                },
                new Scope
                {
                    Name = "api2.read_only",
                    DisplayName = "Read only access to API 2"
                }
            }
        }
    };
}

装载用户身份单元资源由IProfileService实现来完成。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ASP.NET Core身份认证服务框架IdentityServer4(2)-整体介绍

    晓晨
  • .NET Core 使用 NZookeeper 连接 Zookeeper

    开源地址:https://github.com/stulzq/NZookeeper

    晓晨
  • 使用xshell连接服务器,数字键盘无法使用解决办法

    晓晨
  • 解决.net core3.1使用docker部署在Ubuntu上连接sqlserver报error:35的问题

    最近把一个项目从core2.2迁移至core3.1,在本地win上跑没有问题,但是上线到生产Ubuntu docker环境下连接不上sqlserver报以下错误...

    kklldog
  • 安装CentOS7虚拟机, 配置docker套件

    CentOS7比ubuntu的一键式安装要稍微复杂一些, 有些小伙伴按照下一步, 下一步的套路安装完成, 发现没有图像化界面, 在纯粹的命令行里面, 很多小伙伴...

    zhaoolee
  • electron开发客户端注意事项

    electron分主进程和渲染进程,渲染进程又分主窗口的渲染进程和子窗口的渲染进程

    liulun
  • H3C 7503E Qos配置实例

    杨强生
  • 开源软件脱险!Linux硬核回应美实体清单:已开源软件属于全人类,不受制于EAR

    随着中美关系日益紧张,技术圈也受到波及,前两周,国商务部将哈工大、北航等33家机构纳入实体清单,也就是说,凡是在实体清单以内的公司以及机构,如果没有获得美国政府...

    大数据文摘
  • 解决docker容器启动不了的问题

    今天在学习docker的时候遇到个问题,在通过镜像创建容器的过程中,使用命令:docker run --name docker-test -d learn/pi...

    kevinfaith
  • Source Insight 4.0初用(上)

    看RT-Thread肯定免不了看源码,我之前一直是用vscode看一些小而短的源码.这种重量级的代码.我觉得应该用更好的阅读器来看.

    云深无际

扫码关注云+社区

领取腾讯云代金券