IdentityServer4(9)- 使用OpenID Connect添加用户身份验证(implicit)

在本快速入门中,我们希望通过 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检索。

原文地址:https://www.cnblogs.com/yanglang/p/12243413.html

时间: 2024-08-29 16:57:45

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

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

使用IdentityServer4 实现OpenID Connect服务端,添加用户身份验证.客户端调用,实现授权. IdentityServer4 目前已更新至1.0 版,在之前的文章中有所介绍.IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习保护API . 本文环境:IdentityServer4 1.0  .NET Core 1.0.1 下面正式开始. 新建IdentityServer4服务端 服务端也就是提供服务,如QQ

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

原文:.NET Core IdentityServer4实战 第二章-OpenID Connect添加用户认证 内容:本文带大家使用IdentityServer4进行使用OpenID Connect添加用户认证 作者:zara(张子浩) 欢迎分享,但需在文章鲜明处留下原文地址. 在这一篇文章中我们希望使用OpenID Connect这种方式来验证我们的MVC程序(需要有IdentityServer4),我们首先需要干什么呢?那就是搞一个UI,这样非常美观既可以看到我们的身份验证效果,那么Iden

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

一.概述 在前二篇中讲到了客户端授权的二种方式: GrantTypes.ClientCredentials凭据授权和GrantTypes.ResourceOwnerPassword密码授权,都是OAuth2.0协议.本篇使用OpenID Connect添加用户认证,客户端授权是GrantTypes.Implicit隐式流授权,是OCID协议. 本篇示例中只有二个项目:一个IdentityServer的mvc应用程序,一个客户端mvc应用程序(用户client端). 下面介绍身份认证交互流程: (

为CDH 5.7集群添加Kerberos身份验证及Sentry权限控制

4. 为CDH 5集群添加Kerberos身份验证4.1 安装sentry1.点击"操作","添加服务":2.选择sentry,并"继续": 3.选择一组依赖关系 4.确认新服务的主机分配 5.配置存储数据库:在mysql中创建对应用户和数据库: mysql>create database sentry default character set utf8 collate utf8_general_ci; mysql>grant al

《Apache服务用户身份验证管理》RHEL6.3

1.安装apache软件包 Yum install httpd 2.启动apache服务 /etc/init.d/httpd restart 3.创建一个目录,内编辑一个index.html文件 4.给这个目录设密码(是不是很passwd文件内用户的密码文件很像) 5.编辑apache配置文件/etc/httpd/conf/httpd.conf文件(添加如下行) 6.重启apache服务 7.验证是否配置成功 8.结果 <Apache服务用户身份验证管理>RHEL6.3,码迷,mamicode

教你xshell如何使用公钥用户身份验证

如要启用公钥用户身份验证,用户应创建由公钥和密钥组成的用户密钥对.在进行公钥验证时,由Xshell用密钥来创建用户签名,SSH服务器则用公钥来确认其签名. SSH服务器和Xshell均能创建用户密钥,如在服务器上创建密钥,用户需利用Xshell的导入功能把密钥注册到Xshell密钥保存位置.如在Xshell上创建密钥用户应把公钥注册到服务器. 一.如何创建用户密钥: 在[工具]菜单选择[用户秘钥生成向导]. 按照用户秘钥生成向导的提示创建用户秘钥.想要获得产品密钥可以参考:如何注册激活Xshel

Python tkinter 实现简单登陆注册 基于B/S三层体系结构,实现用户身份验证

Python tkinter 实现简单登陆注册 最终效果 开始界面 ? 注册 登陆 ? 源码 login.py # encoding=utf-8 from tkinter import * from tkinter import messagebox as tkMessageBox import mysql_connect as mys import pymysql import base64 #加密 将用户的密码加密后储存到数据库 def encryption(str): str=str.en

Github官方app分析——用户身份验证模块

这篇文章记述的是我对Giuhub官方app的用户身份验证模块的分析. Giuhub的官方app虽然是一个非常小众的程序,但是从程序的设计的角度看,这是一个非常优秀的项目.对于其用户身份验证模块,给我留下的印象更是非常深刻.如果你对此有兴趣,请移步到我的blog,地址如下: 地址: http://kohoh1992.github.io/GithubAppAccountAuthenticatorAnalysis/ 哦,对了.忘记补充了,这里的文章全部都是我个人blog上的副本.如果你对我的blog有

MVC4商城项目二:用户身份验证的实现

用户身份验证,依赖于 forms 身份验证类:FormsAuthentication,它是一串加密的cookie 来实现对控制器访问限制和登陆页面的访问控制.它在浏览器端是这样子的: 需求:我们要实现对用户中心只有登录的用户才能访问,如果没登录就跳转到登录页面,其它页面都可以访问: 首先来看登录控制器的代码: UserDto user = UserService.GetUserById(Convert.ToInt32(msg.Msg)); //为提供的用户名提供一个身份验证的票据 FormsAu