IdentityServer4:授权码模式

1 前置阅读

在阅读本文章之前,你可以先阅读:

  • IdentityServer4是什么
  • IdentityServer4:客户端凭据模式
  • IdentityServer4:资源所有者密码模式

2 授权认证服务(IdentityServer)

API资源配置,中间件配置与客户端凭据模式保持一致。

首先,添加对OpenID Connect Identity Scope的支持
与OAuth 2.0相似,OpenID Connect也使用范围概念。同样,范围代表您要保护的内容以及客户端要访问的内容。与OAuth相比,OIDC中的范围不代表API,而是诸如用户ID,名称或电子邮件地址之类的身份数据。通过修改以下属性来添加对标准openid(主题ID)和profile(名字,姓氏等)范围的支持:IdentityResourcesConfig.cs

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

然后,定义客户,即用于访问新API的客户端应用程序。

public static IEnumerable<Client> Clients =>
    new List<Client>
    {
        new Client
        {
            ClientId = "mvc",
            ClientSecrets = { new Secret("secret".Sha256()) },
            AllowedGrantTypes = GrantTypes.Code,
            RedirectUris = { "https://localhost:5002/signin-oidc" },
            PostLogoutRedirectUris = { "https://localhost:5002/signout-callback-oidc" },
            AllowOfflineAccess = true,
            AllowedScopes = new List<string>
            {
                IdentityServerConstants.StandardScopes.OpenId,
                IdentityServerConstants.StandardScopes.Profile,
                "api1"
            }
        }
    };

最后,配置IdentityServer,在Startup.ConfigureServices中,如下所示:

public void ConfigureServices(IServiceCollection services)
{
    var builder = services.AddIdentityServer()
        .AddInMemoryIdentityResources(Config.IdentityResources)
        .AddInMemoryApiScopes(Config.ApiScopes)
        .AddInMemoryClients(Config.Clients)
        .AddTestUsers(TestUsers.Users);

    builder.AddDeveloperSigningCredential();
}

3 业务资源服务(MVC)

首先,创建S042.MvcClient Web MVC 项目。

然后,将Microsoft.AspNetCore.Authentication.OpenIdConnect的NuGet软件包安装到您的应用程序中。

Microsoft.AspNetCore.Authentication.OpenIdConnect

接着,以下内容添加到ConfigureServices中Startup:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();

    JwtSecurityTokenHandler.DefaultMapInboundClaims = false;

    services.AddAuthentication(options =>
    {
        options.DefaultScheme = "Cookies";
        options.DefaultChallengeScheme = "oidc";
    })
    .AddCookie("Cookies")
    .AddOpenIdConnect("oidc", options =>
    {
        options.Authority = "https://localhost:5001";

        options.ClientId = "mvc";
        options.ClientSecret = "secret";
        options.ResponseType = "code";

        options.SaveTokens = true;

        options.Scope.Add("api1");
        options.Scope.Add("offline_access");
    });
}

AddAuthentication 将身份验证服务添加到DI。

我们使用一个Cookie在本地登录的用户(通过"Cookies"为DefaultScheme),和我们设定的DefaultChallengeScheme到oidc,因为当我们需要用户登录,我们将使用ID连接协议。

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

最后,AddOpenIdConnect用于配置执行OpenID Connect协议的处理程序。该Authority指示了信任令牌服务所在。然后,我们通过ClientId和标识此客户ClientSecret。 SaveTokens用于将来自IdentityServer的令牌保留在cookie中。

最后,添加UseAuthentication到Configure在Startup:

app.UseStaticFiles();

app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();

app.UseEndpoints(endpoints =>
{
    endpoints.MapDefaultControllerRoute()
        .RequireAuthorization();
});

RequireAuthorization方法禁用整个应用程序的匿名访问。

4 测试客户端

启动MVC应用程序,您应该看到重定向到IdentityServer的登录页面。
image

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

posted @ 2021-04-01 17:33  南荣相如  阅读(338)  评论(0编辑  收藏  举报