目录
在本文中,我们将看到使用Identity Server进行身份验证和授权的奇怪情况。我们将介绍OAuth 2.0和OpenID Connect等花哨的术语。本文的目的是指导您完成实现身份验证和授权时必须经历的所有混乱过程。我会尽力用通俗易懂的英语来解释。
OAuth 2.0到底是什么?
OAuth 2.0是授权协议,允许用户授予第三方应用程序访问用户的资源,而不实际暴露用户的身份或凭证。这里要注意的一点是它是一个授权协议,应仅用于授权方案,而不用于身份验证工作流。
为什么使用OpenID Connect?
OAuth 2.0在解决授权问题方面非常出色,但是我们需要一个解决方案来处理用户身份验证用例。精明的大脑汇聚在一起,以构建有效的解决方案。OpenID Connect是在OAuth 2.0框架之上构建的身份协议。
向IdentityServer打个招呼!👋
IdentityServer是用于ASP.NET Core的OpenID Connect和OAuth 2.0框架。IdentityServer是OpenID Connect的官方认证实现。
按照IdentityServer
的官方文档,它有很多的就业机会和特点:
- 保护您的资源
- 使用本地帐户存储或通过外部身份提供程序对用户进行身份验证
- 提供会话管理和单点登录
- 管理和认证客户
- 向客户端发布身份和访问令牌
- 验证令牌
Hello World程序
在本教程中,我们将构建一个中央身份验证系统,该系统将处理来自MVC和angular应用程序的身份验证请求以访问受保护的资源。
Hello World程序
MVC应用
angular应用
我们将使用IdentityServer
建立一个中央身份验证系统。然后,我们将创建一个MVC应用,其安全页面可以在身份验证服务器进行身份验证后访问。我们还将创建一个Angular应用程序,该应用程序将在身份验证后能够访问安全的API。
设置中央身份验证系统所需的步骤——从1000英尺开始查看
- 创建MVC ASP.NET Core项目
- 添加
IdentityServer
NuGet软件包 - 添加EF Core NuGet软件包以存储客户端和配置
- 在启动中配置
IdentityServer
服务 - 在中间件中添加
IdentityServer
管道 - 在数据库中播种客户端和资源数据
- 创建
AccountController
以处理注册和登录场景
从头开始设置身份验证服务器
1、创建一个空的MVC dotnet core项目。
2、添加所需的NuGet软件包。
这是几个包,我们需要设置IdentityServer
,AspNetIdentity
以及最后EF的持久性。
3、让我们在启动文件中配置IdentityServer
,AspNetIdentity
和EF。
让我们了解我们在这里做了什么。首先,我们通过创建自己的DbContext
来配置实体框架,然后使用相同的DbContext
进行AspNetIdentity
配置。最后,我们通过提供自定义ConfiguartionDBContext
和PersistedGrantDbContext
进行IdentityServer
的配置。所有客户端和资源信息将通过这些上下文存储。
4、在中间件管道中,我们只需要添加一行即可配置IdentityServer
中间件。
自定义DbContext
类:
using AuthorizationServer.Models;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;namespace AuthorizationServer.Persistence
{
public class AuthDbContext : IdentityDbContext<AppUser>
{
public AuthDbContext(DbContextOptions<AuthDbContext> options)
: base(options)
{
}protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.HasDefaultSchema("Identity");
}
}
}using IdentityServer4.EntityFramework.DbContexts;
using IdentityServer4.EntityFramework.Options;
using Microsoft.EntityFrameworkCore;namespace AuthorizationServer.Persistence
{
public class AuthConfigurationDbContext :
ConfigurationDbContext<AuthConfigurationDbContext>
{
public AuthConfigurationDbContext
(DbContextOptions<AuthConfigurationDbContext> options,
ConfigurationStoreOptions storeOptions) : base(options, storeOptions)
{
}protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.HasDefaultSchema("Identity");
}
}
}using IdentityServer4.EntityFramework.DbContexts;
using IdentityServer4.EntityFramework.Options;
using Microsoft.EntityFrameworkCore;namespace AuthorizationServer.Persistence
{
public class AuthPersistedGrantDbContext :
PersistedGrantDbContext<AuthPersistedGrantDbContext>
{
public AuthPersistedGrantDbContext
(DbContextOptions<AuthPersistedGrantDbContext> options,
OperationalStoreOptions storeOptions) : base(options, storeOptions)
{
}protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.HasDefaultSchema("Identity");
}
}
}
没什么,我们只是创建了自定义的DbContext
,所以我们可以有一个自定义的架构名称。
5、连接所有DbContext
之后,我们可以创建一个种子类来为客户和资源信息提供种子。我们可以将所有信息直接添加到数据库中,也可以在应用程序启动时为数据添加种子。
我们需要将由IdentityServer
进行身份验证的客户端信息,在我们的示例中,我们有两个客户端,一个是MVC应用程序,另一个是Angular应用程序。我们需要指定这些应用允许使用哪些资源。Angular应用程序需要WeatherAPI
、
OpenId
和Profile
一起访问。同样,MVC应用将需要访问OpenId
和Profile
。我们需要添加WeatherAPI
为作用域。客户端的URL是托管应用程序的URL。
6、现在,我们需要一个控制器和一个可以管理用户注册和登录的视图。
AccountController.cs
就是这样,我们的AuthenticationServer
已经准备好处理身份验证和授权请求。
构建一个MVC应用
假设我们有一个MVC应用程序,其页面是安全的,只有经过身份验证后才能访问。
我们需要配置其启动以使其了解AuthenticationServer
和Authentication
机制。
Startup.cs
AddOpenIdConnect
方法需要我们指定AuthenticationServer
和ClientId
,ClientSecret
和ResponseType
的网址选项。ClientId
应该与我们在身份验证服务器中配置的相同。
现在创建一个视图home/secret,并将[Authorize]
属性添加到其controller/action方法。此后,如果用户尝试访问secret视图,它将把请求重定向到身份验证服务器,并在提供有效的用户名和密码后,用户将能够看到该页面。
设置一个Angular应用
对于Angular应用程序,我们需要一些可以与应用程序进行通信的后端API。然后,我们将在API中设置身份验证机制。身份验证后的Angular应用程序将JWT令牌发送到API,API会验证该令牌并向身份验证服务器声明所有权。
让我们在API启动文件中配置身份验证机制。
Startup.cs
如果仔细观察,我们已经设置了身份验证服务器的URL,还指定了令牌中所需的声明/作用域的名称。
来到我们的Angular应用程序时,我们需要一个可靠的npm
软件包,该软件包可以处理在Angular应用程序和身份验证服务器之间建立连接所需的所有样板代码。
让我们将“angular-auth-oidc-client ”包打包到我们的应用程序中。
该软件包非常棒,因为它可以处理我们的大部分工作量,我们只需要编写一个配置函数即可在其中指定身份验证服务器的URL和所需的声明/范围以及一些重定向URL。就是这样,我们很坚强。
identity.ts
app.module.ts
让我们编写一些用于登录用户的代码,并在成功登录后调用API,方法是在从身份验证服务器获得的标头中发送令牌,以获取数据。
最后的话
通过使用IdentityServer
,我们可以从主应用程序中删除身份验证/授权逻辑,并使其更松散地耦合在一起。IdentityServer
帮助我们创建一个中央身份验证系统。在微服务领域,我们建立了一个中央身份验证系统,例如通过IdentityServer
创建的系统。
我已经在此处附上了代码片段的屏幕快照,但是您可以在GitHub上找到完整的源代码。
资源资源
- https://oauth.net/2/
- https://auth0.com/docs/protocols/protocol-oauth2
- https://openid.net/connect/
- https://auth0.com/docs/protocols/openid-connect-protocol
coding快乐的编码!