IdentityServer4 中文文档 -11- (快速入门)添加基于 OpenID Connect 的用户认证

摘要:
完成之后,我们将创建一个使用IdentityServer进行身份认证的MVC应用程序。添加UIIdentityServer内置了OpenIDConnect需要的所有协议支持。因为在每个IdentityServer的实现中,视觉、感觉以及实际工作流可能总是有所不同的,所以我们提供了一套基于MVC的样例UI,你可以将其作为启动点来使用。dev分支则与IdentityServer4的当前开发构建相符。将它指向IdentityServer,指定一个客户端ID并且告诉它哪个中间件将会负责本地登陆。在与OAuth相比,OIDC中的scopes不仅代表API,还代表了诸如用户id、用户名或邮箱地址等身份数据。
IdentityServer4 中文文档 -11- (快速入门)添加基于 OpenID Connect 的用户认证

原文:http://docs.identityserver.io/en/release/quickstarts/3_interactive_login.html

目 录

上一篇:IdentityServer4 中文文档 -10- (快速入门)使用密码保护API
下一篇:IdentityServer4 中文文档 -12- (快速入门)添加外部认证支持

在这个快速启动中,我们希望通过OpenID Connect协议向我们的 IdentityServer 添加对交互式用户身份验证的支持。

完成之后,我们将创建一个使用 IdentityServer 进行身份认证的 MVC 应用程序。

添加 UI(用户界面)

IdentityServer 内置了 OpenID Connect 需要的所有协议支持。你需要提供必需的 UI 部分,包括 登录、注销、授权确认以及错误页。

因为在每个 IdentityServer 的实现中,视觉、感觉以及实际工作流可能总是有所不同的,所以我们提供了一套基于 MVC 的样例 UI,你可以将其作为启动点来使用。

这套 UI 可以在 快速入门仓库 找到。你还可以克隆或下载这个仓库,将其中的控制器、视图、模型以及 CSS 放到你的 Web 应用程序中。

你还可以在你的 Web 应用程序中以命令行的方式运行以下命令来自动下载:

iex ((New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/IdentityServer/IdentityServer4.Quickstart.UI/release/get.ps1'))

查看 自述文件 以了解更多 快速入门UI 相关的信息。

注意: UI 仓库的 release 分支拥有与最新发布的稳定版相匹配的 UI。dev 分支则与 IdentityServer4 的当前开发构建相符。如果你想要寻找指定版本的 UI,请查看相应的标签。

花一些时间去查阅控制器和模型,你越是了解他们,将来要修改他们就越简单。大部分代码都以“功能目录”的样式放在 “Quickstart” 文件夹下,如果这种样式不适合你,那就按照你想要的方式随意组织代码。

创建一个 MVC 客户端

接下来你将向解决方案添加一个 MVC 应用程序,可以使用 ASP.NET Core "Web 应用程序" 模板来实现。 将应用程序配置为使用 5002 端口(可以查看概览部分以了解如何配置)。

为了能向 MVC 应用程序添加 OpenID Connect 认证支持,请添加如下 NuGet 程序包:

  • Microsoft.AspNetCore.Authentication.Cookies
  • Microsoft.AspNetCore.Authentication.OpenIdConnect

然后添加这两个中间件到你的管道中 —— Cookies 对应的中间件很简单:

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationScheme="Cookies"
});

OpenID Connect 中间件需要稍微多一些配置。将它指向 Identity Server,指定一个客户端 ID 并且告诉它哪个中间件将会负责本地登陆(也就是 cookies 中间件)。此外,我们关闭了 JWT 身份信息类型映射,这样就允许 well-known 身份信息(比如,“sub” 和 “idp”) 无干扰地流过。这个身份信息类型映射的 “清理” 必须在调用 UseOpenIdConnectAuthentication() 之前完成:

JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions
{
    AuthenticationScheme = "oidc",
    SignInScheme = "Cookies",
    Authority = "http://localhost:5000",
    RequireHttpsMetadata = false,
    ClientId = "mvc",
    SaveTokens = true
});

两个中间件都应该在 MVC 之前添加到管道。

下一个步骤是触发认证握手,为此打开 home 控制器并添加 [Authorize] 到其中一个 action 上。另外,修改 action 对应的视图以显示用户的身份信息,比如:

<dl>
    @foreach (var claim in User.Claims)
    {
        <dt>@claim.Type</dt>
        <dd>@claim.Value</dd>
    }
</dl>

现在,如果你使用浏览器导航到上述控制器,一个Mvc客户端将视图重定向到 IdentityServer - 这会导致错误,因为 MVC 客户端还没有注册(在 IdentityServer 上定义)呢。

添加 OpenID Connect 身份 Scopes 支持

与 OAuth 2.0 相似,OpenID Connect 也使用 scopes 这个概念。再一次说明,Scopes 表示你想要保护的和客户端想要访问的事物。在与 OAuth 相比,OIDC(OpenID Connect) 中的 scopes 不仅代表 API,还代表了诸如 用户id、用户名 或 邮箱地址等身份数据。

通过(在 Config.cs 中)添加新的帮助器来创建 IdentityResource 对象的集合,可以添加对标准 openid(subject id,这里指的是用户id)和 profile(姓氏,名称 等等)等 scopes 的支持:

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

注意:所有标准的 Scopes 和他们对应的 身份信息 都可以在 OpenID Connect 规范 中找到。

接下来在 Startup.cs 中你要将这些身份资源添加到你的 IdentityServer 配置。在你调用 AddIdentityServer() 的地方使用 AddInMemoryIdentityResources 扩展方法即可:

public void ConfigureServices(IServiceCollection services)
{
    // 使用内存存储,密钥,客户端和资源来配置身份服务器。
    services.AddIdentityServer()
        .AddTemporarySigningCredential()
        .AddInMemoryApiResources(Config.GetApiResources())
        .AddInMemoryClients(Config.GetClients())
        .AddTestUsers(Config.GetUsers())
        .AddInMemoryIdentityResources(Config.GetIdentityResources());
}

为 OIDC 隐式流添加客户端定义

最后一个步骤是为 IdentityServer 添加一个新的客户端。

目前,我们添加的基于 OIDC 的客户端与 OAuth 2.0 客户端非常相似。但是由于 OIDC 中的流总是交互式的,所以我们需要添加一些重定向 URL 到我们的配置中。

添加以下代码到你的客户端配置中:

public static IEnumerable<Client> GetClients()
{
    return new List<Client>
    {
        // 省略的客户端...

        // OIDC 隐式流客户端(MVC)
        new Client
        {
            ClientId = "mvc",
            ClientName = "Mvc 客户端",
            AllowedGrantTypes = GrantTypes.Implicit,
            // 登录后重定向到的地址
            RedirectUris = { "http://localhost:5002/signin-oidc" },
            // 注销后重定向到的地址
            AllowedScopes = new List<string>
            {
                IdentityServerConstants.StandardScopes.OpenId,
                IdentityServerConstants.StandardScopes.Profile
            }
        }
    };
}

测试 MVC 客户端

现在,对于新的 MVC 客户端,一切都准备好了。

将浏览器导航到受保护的 控制器 action 以触发认证握手。你应该能看到客户端将你重定向到了 IdentityServer 的登录页。

IdentityServer4 中文文档 -11- (快速入门)添加基于 OpenID Connect 的用户认证第1张

登录成功后,用户将在授权确认页中被呈现出来。在这里用户可以决定他是否想要发布他的身份信息给客户端应用程序。

注意: 授权确认页可以通过客户端定义对象的 RequireConsent 属性被关闭(以每个客户端为单位)。

IdentityServer4 中文文档 -11- (快速入门)添加基于 OpenID Connect 的用户认证第2张

最终浏览器将被重定向回客户端应用程序,即展示用户的身份信息。

IdentityServer4 中文文档 -11- (快速入门)添加基于 OpenID Connect 的用户认证第3张

注意:在开发期间你有时候可能会看到 无法验证令牌 的异常信息。这是因为实际上签名密钥材料是凭空产生的,并且在只内存中驻留。这个异常在 客户端 与 IdentityServer 不同步时就会发生。简单地重复客户端上的操作,等到下一次元数据被捕获时,一切都会再次正常工作的。

添加注销

最后的最后,是给 MVC 客户端添加 注销功能。

通过 IdentityServer 这样的服务进行身份认证,单单清除本地应用程序的 Cookies 是不够的。你还需要往返一次 IdentityServer 来清理集中式单点登录会话。

具体的协议步骤都在 OpenID Connect 中间件中实现了,简单地添加以下代码到某个控制器中就可以用来触发注销:

public async Task Logout()
{
    await HttpContext.Authentication.SignOutAsync("Cookies");
    await HttpContext.Authentication.SignOutAsync("oidc");
}

进一步实验

如前面所说,OpenID Connect 中间件默认会请求 profile scope。这个 scope 还包含了用户名或个人主页等身份信息。

让我们将这些身份信息添加到用户定义里面,这样的话 IdentityServer 就可以把它们放到身份令牌中了:


public static List<TestUser> GetUsers()
{
    return new List<TestUser>()
    {
        new TestUser
        {
            SubjectId="1",
            Username="爱丽丝",
            Password="password",


            Claims = new []
            {
                new Claim("name", "爱丽丝"),
                new Claim("website", "https://alice.com")
            }
        },
        new TestUser
        {
            SubjectId="2",
            Username="博德",
            Password="password",

            Claims = new []
            {
                new Claim("name", "博德"),
                new Claim("website", "https://bob.com")
            }
        }
    };
}

下一次你认证的时候,你的身份信息页将会显示额外的身份信息。

请随意添加更多的身份信息 - 还有更多的 scopes。OpenID Connect 中间件上的 Scope 属性是你用来配置哪些 Scopes 将在认证期间被发送到 IdentityServer 的地方。

值得注意的是,对令牌中身份信息的遍历是一个扩展点 - IProfileService。因为我们正在使用 AddTestUser,所以默认使用的是 TestUserProfileService。你可以检出这里的源代码来查看它的工作原理。

目 录

上一篇:IdentityServer4 中文文档 -10- (快速入门)使用密码保护API
下一篇:IdentityServer4 中文文档 -12- (快速入门)添加外部认证支持

免责声明:文章转载自《IdentityServer4 中文文档 -11- (快速入门)添加基于 OpenID Connect 的用户认证》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Cocos2d—X游戏开发之VS2010 控制台输出中文,模拟器中文乱码问题解决ThingJS搭建项目流程解析下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

www.nocmd.com 精品软件 坚持绿色之路 共筑生态之基

https://www.nocmd.com/ www.nocmd.com 精品软件 坚持绿色之路 共筑生态之基 https://www.vipc6.com/VIPC6资源网,VIPC6免费提供 ,优质付费破解资源 https://www.sharerj.com/ 软件铺...

google下载安装油猴

Tampermonkey 俗称“油猴子”,它其实是一个脚本引擎,它提供了脚本安装、标签中的脚本运行状况速览、自动更新检查等管理功能。它可以自由定制网页,实现你想要的各种功能:比如去除网页弹窗贴边广告,突破下载网盘文件限速,破解某些VIP的限制这些都是他的强大功能所在。比如你想要定制某一个功能,那么你只需往油猴子里面添加对应的脚本就可以了,而不用再安装其它浏...

npm + gulp + scss + 项目架构

原创:格尔尼卡ぃ 在此声明,每部分红色标注为文件的变化,并且都带有关键性的注释语句。希望能给大家带来帮助。 一、npm讲解 https://www.npmjs.com.cn/ NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种: 允许用户从NPM服务器下载别人编写的第三方包到本地使用。 允许...

开源CRM和ERP撑起后台系统能走多远

任何一家公司的后台系统需要许多不同层软件。像电子邮件和基本网站这些必要的部分是运行起来相对简单的。最困难的任务就是提供下列这种软件:充当公司业务 的核心、处理所有大大小小的最基本的细节;以及让客户支付发票金额、确保银行账户里面有足够现金来付工资。 这些系统就包括客户关系管理(CRM)和企业资源规划(ERP)等应用系统,但它们其实只是一组精心创建的数据库表,...

Unity3D实践系列01,创建项目

下载并安装Unity5软件客户端。 打开软件,注册Unity帐号,并用注册帐号登录。 点击"创建Project"按钮。 把项目命名为"My First Unity Project"。 点击左下方的"Assert packages"按钮,点击"select all"文字,点击"Done"按钮,点击"Create project"按钮。 创建完毕,多了一个与项...

Ubuntu apt-cache命令查找可用软件包

本文GoFace给大家讲解下在Ubuntu及相同包管理的linux系统下如何查找可用软件包。在Ubuntu上大家一般使用apt-get安装软件,如果想查找某一包软件仓库中是否有,并不是使用apt-get search或apt-get –list,而使用apt-cache命令。 apt-cache search string //在源软件列表中查找相应的...