ASP.NET Core:使用IdentityServer构建可靠的身份验证和授权系统

目录

OAuth 2.0到底是什么?

为什么使用OpenID Connect?

向IdentityServer打个招呼!👋

Hello World程序

设置中央身份验证系统所需的步骤——从1000英尺开始查看

从头开始设置身份验证服务器

构建一个MVC应用

设置一个Angular应用

最后的话

资源资源


在本文中,我们将看到使用Identity Server进行身份验证和授权的奇怪情况。我们将介绍OAuth 2.0OpenID Connect等花哨的术语。本文的目的是指导您完成实现身份验证和授权时必须经历的所有混乱过程。我会尽力用通俗易懂的英语来解释。

OAuth 2.0到底是什么?

OAuth 2.0是授权协议,允许用户授予第三方应用程序访问用户的资源,而不实际暴露用户的身份或凭证。这里要注意的一点是它是一个授权协议,应仅用于授权方案,而不用于身份验证工作流。

为什么使用OpenID Connect

OAuth 2.0在解决授权问题方面非常出色,但是我们需要一个解决方案来处理用户身份验证用例。精明的大脑汇聚在一起,以构建有效的解决方案。OpenID Connect是在OAuth 2.0框架之上构建的身份协议。

IdentityServer打个招呼!👋

IdentityServer是用于ASP.NET CoreOpenID ConnectOAuth 2.0框架。IdentityServerOpenID Connect的官方认证实现。

按照IdentityServer的官方文档,它有很多的就业机会和特点:

  • 保护您的资源
  • 使用本地帐户存储或通过外部身份提供程序对用户进行身份验证
  • 提供会话管理和单点登录
  • 管理和认证客户
  • 向客户端发布身份和访问令牌
  • 验证令牌

Hello World程序

在本教程中,我们将构建一个中央身份验证系统,该系统将处理来自MVCangular应用程序的身份验证请求以访问受保护的资源。

 

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软件包。

这是几个包,我们需要设置IdentityServerAspNetIdentity以及最后EF的持久性。

3、让我们在启动文件中配置IdentityServerAspNetIdentityEF

 

让我们了解我们在这里做了什么。首先,我们通过创建自己的DbContext来配置实体框架,然后使用相同的DbContext进行AspNetIdentity配置。最后,我们通过提供自定义ConfiguartionDBContextPersistedGrantDbContext进行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应用程序需要WeatherAPIOpenIdProfile一起访问。同样,MVC应用将需要访问OpenIdProfile。我们需要添加WeatherAPI为作用域。客户端的URL是托管应用程序的URL

6、现在,我们需要一个控制器和一个可以管理用户注册和登录的视图。

 

AccountController.cs

就是这样,我们的AuthenticationServer已经准备好处理身份验证和授权请求。

构建一个MVC应用

假设我们有一个MVC应用程序,其页面是安全的,只有经过身份验证后才能访问。

我们需要配置其启动以使其了解AuthenticationServerAuthentication机制。

 

Startup.cs

AddOpenIdConnect方法需要我们指定AuthenticationServerClientIdClientSecretResponseType的网址选项。ClientId应该与我们在身份验证服务器中配置的相同。

现在创建一个视图home/secret,并将[Authorize]属性添加到其controller/action方法。此后,如果用户尝试访问secret视图,它将把请求重定向到身份验证服务器,并在提供有效的用户名和密码后,用户将能够看到该页面。

设置一个Angular应用

对于Angular应用程序,我们需要一些可以与应用程序进行通信的后端API。然后,我们将在API中设置身份验证机制。身份验证后的Angular应用程序将JWT令牌发送到APIAPI会验证该令牌并向身份验证服务器声明所有权。

让我们在API启动文件中配置身份验证机制。

 

Startup.cs

如果仔细观察,我们已经设置了身份验证服务器的URL,还指定了令牌中所需的声明/作用域的名称。

来到我们的Angular应用程序时,我们需要一个可靠的npm软件包,该软件包可以处理在Angular应用程序和身份验证服务器之间建立连接所需的所有样板代码。

让我们将angular-auth-oidc-client ”包打包到我们的应用程序中。

该软件包非常棒,因为它可以处理我们的大部分工作量,我们只需要编写一个配置函数即可在其中指定身份验证服务器的URL和所需的声明/范围以及一些重定向URL。就是这样,我们很坚强。

 

identity.ts

 

app.module.ts

让我们编写一些用于登录用户的代码,并在成功登录后调用API,方法是在从身份验证服务器获得的标头中发送令牌,以获取数据。

最后的话

通过使用IdentityServer,我们可以从主应用程序中删除身份验证/授权逻辑,并使其更松散地耦合在一起。IdentityServer帮助我们创建一个中央身份验证系统。在微服务领域,我们建立了一个中央身份验证系统,例如通过IdentityServer创建的系统。

我已经在此处附上了代码片段的屏幕快照,但是您可以在GitHub找到完整的源代码。

资源资源

coding快乐的编码!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值