本文为 OpenID Connect 简化模式(implicit)

已更新至.NET Core 2.2

在本快速入门中,我们希望通过 OpenID Connect 协议向我们的 IdentityServer 添加对用户认证交互的支持。

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

添加UI

OpenID Connect 所需的所有协议支持都已内置到 IdentityServer 中。您需要为提供必要的UI部件:登录,注销,同意授权和错误页面。

根据业务场景的不同对 IdentityServer 的实现也有所不同,但我们提供了一个基于 MVC 的示例UI,您可以将其用作起步。

可以在快速入门UI仓库中找到此UI。 您可以克隆或下载此repo,并将Controller,View,Model和CSS放入IdentityServer Web 应用程序中。

或者,您可以使用.NET CLI(从 src/IdentityServer 文件夹中运行命令):

dotnet new is4ui

添加 MVC UI 后,您还需要在 DI 系统和管道中启用 MVC。 当您查看Startup.cs时,您将在 ConfigureServices 和 Configure 方法中找到有关如何启用MVC的注释。

运行IdentityServer应用程序,您现在应该看到一个主页。

花一些时间检查控制器和模型,您越了解它们,就越容易掌握以便修改。 大多数代码使用“feature folder”样式存在于“Quickstart”文件夹中。 如果此样式不适合您,请随意以您想要的任何方式组织代码。

创建 MVC 客户端

接下来,您将向您的解决方案添加MVC应用程序。 使用 ASP.NET Core “Web Application” (即 MVC) 模板。 不要在向导中配置“Authentication"设置 - 您将在此快速入门中手动执行此操作。 创建项目后,将应用程序配置为在端口5002上运行。

要将对 OpenID Connect 身份认证的支持添加到MVC应用程序,请在Startup中将以下内容添加到ConfigureServices

public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(); JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); services.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies")
.AddOpenIdConnect("oidc", options =>
{
options.Authority = "http://localhost:5000";
options.RequireHttpsMetadata = false; options.ClientId = "mvc";
options.SaveTokens = true;
});
}

AddAuthentication将身份认证服务添加到 DI。 我们使用 cookie 来本地登录用户(通过“Cookies”作为DefaultScheme),我们将 DefaultChallengeScheme 设置为“oidc”,因为当我们需要用户登录时,我们将使用OpenID Connect 协议。

然后,我们使用 AddCookie 添加可以处理 cookie 的处理程序。

最后,AddOpenIdConnect用于配置执行 OpenID Connect 协议的处理程序。Authority表明我们信任的 IdentityServer 地址。然后我们通过ClientId。识别这个客户端。 SaveTokens用于在 cookie 中保留来自IdentityServer 的令牌(稍后将需要它们)。

同样,我们已经关闭了 JWT Claim类型映射,以允许常用的Claim(例如'sub'和'idp')。

JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

然后要确保认证服务执行对每个请求的验证,加入UseAuthenticationConfigure中:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
} app.UseAuthentication(); app.UseStaticFiles();
app.UseMvcWithDefaultRoute();
}

应在管道中的MVC之前添加认证中间件。

最后一步是触发身份认证。为此,请转到 Controller 并添加[Authorize]特性到其中一个Action。还要修改主视图以显示用户的Claim以及cookie属性:

@using Microsoft.AspNetCore.Authentication

<h2>Claims</h2>

<dl>
@foreach (var claim in User.Claims)
{
<dt>@claim.Type</dt>
<dd>@claim.Value</dd>
}
</dl> <h2>Properties</h2> <dl>
@foreach (var prop in (await Context.AuthenticateAsync()).Properties.Items)
{
<dt>@prop.Key</dt>
<dd>@prop.Value</dd>
}
</dl>

如果您现在使用浏览器访问该控制器,将会被重定向到IdentityServer - 这将导致错误,因为MVC客户端尚未注册。

添加 OpenID Connect Identity Scope

与OAuth 2.0类似,OpenID Connect也使用Scope概念。同样,Scope代表您想要保护的内容以及客户端想要访问的内容。与OAuth相比,OIDC中的Scope不仅代表API资源,还代表用户ID,姓名或电子邮件地址等身份资源

通过修改 Config.cs 中的 GetIdentityResources 方法,添加对标准 openid(subject id)和profile (名字,姓氏等)Scope的支持:

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

所有标准Scope及其相应的Claim都可以在OpenID Connect规范中找到。

添加OpenID Connect简化流程客户端

最后一步是将MVC客户端的配置信息添加到 IdentityServer。

基于OpenID Connect的客户端与我们目前添加的OAuth 2.0客户端非常相似。但由于OIDC中的流程始终是交互式的,因此我们需要在配置中添加一些重定向URL。

将以下内容添加到客户端配置中:

public static IEnumerable<Client> GetClients()
{
return new List<Client>
{
// other clients omitted... // OpenID Connect implicit flow client (MVC)
new Client
{
ClientId = "mvc",
ClientName = "MVC Client",
AllowedGrantTypes = GrantTypes.Implicit, // 登录成功回调处理地址,处理回调返回的数据
RedirectUris = { "http://localhost:5002/signin-oidc" }, // where to redirect to after logout
PostLogoutRedirectUris = { "http://localhost:5002/signout-callback-oidc" }, AllowedScopes = new List<string>
{
IdentityServerConstants.StandardScopes.OpenId,
IdentityServerConstants.StandardScopes.Profile
}
}
};
}

测试客户端

通过访问到受保护的Controller操作来触发身份认证。您应该会看到重定向到IdentityServer的登录页面。

成功登录后,将向用户显示同意授权页面。在这里,用户可以决定是否要将他的身份信息发布到客户端应用程序。

可以使用客户端配置上RequireConsent的属性关闭同意授权页面。

之后,IdentityServer将重定向回MVC客户端,其中OpenID Connect身份认证处理程序处理响应并通过设置 cookie 在本地登录用户。最后,MVC视图将显示cookie的内容。

如您所见,cookie 包含两部分,即用户的Claim和一些元数据。此元数据还包含IdentityServer发出的原始令牌。可以将此令牌复制到jwt.io以检查其内容。

添加注销

后一步是向MVC客户端添加注销。

使用IdentityServer等身份认证服务,仅清除本地应用程序cookie是不够的。此外,您还需要向IdentityServer进行往返交互以清除中央单点登录会话。

确切的协议步骤在OpenID Connect处理程序中实现,只需将以下代码添加到某个控制器即可触发注销:

public IActionResult Logout()
{
return SignOut("Cookies", "oidc");
}

这将清除本地cookie,然后重定向到IdentityServer。IdentityServer将清除其cookie,然后为用户提供返回MVC应用程序的链接。

进一步的实验

如上所述,OpenID Connect处理程序默认要求 profile scope。此Scope还包括 name 或者 website。

让我们将这些Claim添加到用户信息中,以便IdentityServer可以将它们放入 identity token:

public static List<TestUser> GetUsers()
{
return new List<TestUser>
{
new TestUser
{
SubjectId = "1",
Username = "alice",
Password = "password", Claims = new []
{
new Claim("name", "Alice"),
new Claim("website", "https://alice.com")
}
},
new TestUser
{
SubjectId = "2",
Username = "bob",
Password = "password", Claims = new []
{
new Claim("name", "Bob"),
new Claim("website", "https://bob.com")
}
}
};
}

下次进行身份认证时,您的Claim页面现在会显示这些Claim。

添加更多Claim - 以及更多Scope。OpenID Connect中间件上的Scope属性是您配置在身份认证期间将哪些Scope发送到IdentityServer。

值得注意的是,对令牌Claim的检索是一个可扩展点--IProfileService。 由于我们使用的是AddTestUsers,因此默认使用TestUserProfileService。 您可以在此处检查源代码以查看其工作原理,以便实现自定义Claim检索。

资料

本文 Demo:3_ImplicitFlowAuthentication

官方文档原文:Adding User Authentication with OpenID Connect

IdentityServer4(9)- 使用OpenID Connect添加用户身份验证(implicit)的更多相关文章

  1. IdentityServer4 使用OpenID Connect添加用户身份验证

    使用IdentityServer4 实现OpenID Connect服务端,添加用户身份验证.客户端调用,实现授权. IdentityServer4 目前已更新至1.0 版,在之前的文章中有所介绍.I ...

  2. 【转载】IdentityServer4 使用OpenID Connect添加用户身份验证

    使用IdentityServer4 实现OpenID Connect服务端,添加用户身份验证.客户端调用,实现授权. IdentityServer4 目前已更新至1.0 版,在之前的文章中有所介绍.I ...

  3. 第11章 使用OpenID Connect添加用户身份验证 - Identity Server 4 中文文档(v1.0.0)

    在本快速入门中,我们希望通过OpenID Connect协议向我们的IdentityServer添加对交互式用户身份验证的支持. 一旦到位,我们将创建一个将使用IdentityServer进行身份验证 ...

  4. Identity Server 4使用OpenID Connect添加用户身份验证(三)

    一.说明 基于上一篇文章中的代码进行继续延伸,只需要小小的改动即可,不明白的地方可以先看看本人上一篇文章及源码: Identity Server 4资源拥有者密码认证控制访问API(二) GitHub ...

  5. .NET Core IdentityServer4实战 第二章-OpenID Connect添加用户认证

    内容:本文带大家使用IdentityServer4进行使用OpenID Connect添加用户认证 作者:zara(张子浩) 欢迎分享,但需在文章鲜明处留下原文地址. 在这一篇文章中我们希望使用Ope ...

  6. IdentityServer4【QuickStart】之利用OpenID Connect添加用户认证

    利用OpenID Connect添加用户认证 利用OpenID Connect添加用户认证 在这个示例中我们想要通过OpenID Connect协议将交互用户添加到我们的IdentityServer上 ...

  7. asp.net core系列 56 IS4使用OpenID Connect添加用户认证

    一.概述 在前二篇中讲到了客户端授权的二种方式: GrantTypes.ClientCredentials凭据授权和GrantTypes.ResourceOwnerPassword密码授权,都是OAu ...

  8. ASP.NET Core的身份认证框架IdentityServer4(9)-使用OpenID Connect添加用户认证

    OpenID Connect OpenID Connect 1.0是OAuth 2.0协议之上的一个简单的身份层. 它允许客户端基于授权服务器执行的身份验证来验证最终用户的身份,以及以可互操作和类似R ...

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

    IdentityServer4 中文文档 -11- (快速入门)添加基于 OpenID Connect 的用户认证 原文:http://docs.identityserver.io/en/releas ...

随机推荐

  1. SQL语句操作数据

    --切换数据库:手动切换和命令切换 use MySchool --向Student表中插入数据 --语法:INSERT [INTO] 表名 (列名) VALUES (值列表) --注意事项: --1. ...

  2. 别人的Linux私房菜(20)启动流程、模块管理与Loader

    系统启动时,首先加载BIOS,通过BOIS读取COMS的硬件信息,进行自我检测,取得第一个可启动的设备(多个根据设置有关). 读取并执行设备内的MBR启动引导程序,引导程序调用boot sector中 ...

  3. C/C++字符串相关知识使用整理

    C++字符串处理有最原始的char以及string两种方式,这里对其常用的功能进行总结. #include <string>using namespace std; ]; string s ...

  4. Django模板标签

    一.模板标签 1.模板标签是在模板中运用python语言的实现,如for循环,if语句 2.模板标签的运用 2.1在teacher模板下创建students_list模板, 在teacher视图中国创 ...

  5. 2019.03.28 bzoj3325: [Scoi2013]密码(manacher+模拟)

    传送门 题意: 现在有一个nnn个小写字母组成的字符串sss. 然后给你nnn个数aia_iai​,aia_iai​表示以sis_isi​为中心的最长回文串串长. 再给你n−1n-1n−1个数bib_ ...

  6. Codeforces 863 简要题解

    文章目录 A题 B题 C题 D题 E题 F题 G题 传送门 简要题解?因为最后一题太毒不想写了所以其实是部分题解... A题 传送门 题意简述:给你一个数,问你能不能通过加前导000使其成为一个回文数 ...

  7. h3c acl配置一列

    acl number 3004 rule 0 permit ip source 10.2.1.4 0 rule 1 deny ip source 192.168.1.91 0 rule 2 deny ...

  8. Spring的声明式事务管理<tx:advice/>

    <tx:advice/> 有关的设置 这一节里将描述通过 <tx:advice/> 标签来指定不同的事务性设置.默认的 <tx:advice/> 设置如下: 事务传 ...

  9. 零基础Windows + JAVA(jdk)环境搭建以及eclipse安装和使用

    关于java的环境搭建其实网上有很多种,下面小编就自己来操作一下吧~ java的环境搭建最主要的就是jdk的安装及环境变量设置,好了,来看看安装步骤: 一.JDK的下载与安装(java安装包)  JD ...

  10. Android Stdio的问题

    昨天还是可以运行的,今天运行Android Studio,一直提示:Error running app: Instant Run requires 'Tools | android | Enable ...