IdentityServer4(8)- 使用密码认证方式控制API访问(资源全部者密码受权模式)

一.前言

本文已经更新到 .NET Core 2.2git

OAuth 2.0 资源全部者密码模式容许客户端向令牌服务发送用户名和密码,并获取表明该用户的访问令牌。github

除了经过没法浏览器进行交互的应用程序以外,一般建议不要使用资源全部者密码模式。 通常来讲,当您要对用户进行身份验证并请求访问令牌时,使用其中一个交互式 OpenID Connect 流程一般要好得多。api

在这里使用这种模式是为了学习如何快速在 IdentityServer 中使用它,浏览器

二.添加用户

就像API资源(也称为 Scope)、客户端同样,用户也有一个基于内存存储(In-Memory)的实现。服务器

有关如何正确存储(持久化存储)和管理用户账户的详细信息,请查看基于 ASP.NET Identity的快速入门。ide

TestUser 类表明测试用户及其身份信息单元(Claim)。 让咱们经过在 config 类中添加如下代码来建立几个用户:post

首先添加如下语句 到Config.cs文件中:学习

using IdentityServer4.Test;

public static List<TestUser> GetUsers()
{
    return new List<TestUser>
    {
        new TestUser
        {
            SubjectId = "1",
            Username = "alice",
            Password = "password"
        },
        new TestUser
        {
            SubjectId = "2",
            Username = "bob",
            Password = "password"
        }
    };
}

而后将测试用户注册到 IdentityServer:测试

public void ConfigureServices(IServiceCollection services)
{
    // configure identity server with in-memory stores, keys, clients and scopes
    services.AddIdentityServer()
        .AddInMemoryApiResources(Config.GetApiResources())
        .AddInMemoryClients(Config.GetClients())
        .AddTestUsers(Config.GetUsers());
}

AddTestUsers 方法帮咱们作了如下几件事:ui

  • 为资源全部者密码受权添加支持
  • 添加对用户相关服务的支持,这服务一般为登陆 UI 所使用(咱们将在下一个快速入门中用到登陆 UI)
  • 为基于测试用户的身份信息服务添加支持(你将在下一个快速入门中学习更多与之相关的东西)

四.为资源全部者密码受权添加一个客户端定义

你能够经过修改 ·AllowedGrantTypes· 属性简单地添加对已有客户端受权类型的支持。

一般你会想要为资源全部者用例建立独立的客户端,添加如下代码到你配置中的客户端定义中:

public static IEnumerable<Client> GetClients()
{
    return new List<Client>
    {
        // other clients omitted...

        // resource owner password grant client
        new Client
        {
            ClientId = "ro.client",
            AllowedGrantTypes = GrantTypes.ResourceOwnerPassword,

            ClientSecrets =
            {
                new Secret("secret".Sha256())
            },
            AllowedScopes = { "api1" }
        }
    };
}

使用密码受权请求一个令牌

建立一个 ResourceOwnerPassword 控制台项目,经过Nuget添加 IdentityModel

经过以下代码获取Token

// request token
var tokenResponse = await client.RequestPasswordTokenAsync(new PasswordTokenRequest
{
    Address = disco.TokenEndpoint,
    ClientId = "ro.client",
    ClientSecret = "secret",

    UserName = "alice",
    Password = "password",
    Scope = "api1"
});

if (tokenResponse.IsError)
{
    Console.WriteLine(tokenResponse.Error);
    return;
}

Console.WriteLine(tokenResponse.Json);

当您将令牌发送到身份API终结点时,您会注意到与客户端模式相比有一个小但重要的区别。 访问令牌如今将包含惟一标识用户的sub claim。 经过在调用API以后检查内容变量能够看到这个“sub”,而且控制器应用程序也会在屏幕上显示该claim。

sub claim的存在(或不存在)容许API区分表明客户端的调用和表明用户的调用。

下面这张图,是理解的客户端请求流程,

关于上图的补充说明,这里讲一下。api资源收到第一个请求以后,会去id4服务器公钥,而后用公钥验证token是否合法,若是合法进行后面后面的有效性验证。有且只有第一个请求才会去id4服务器请求公钥,后面的请求都会用第一次请求的公钥来验证,这也是jwt去中心化验证的思想。

五.使用Postman调试

使用postman调用生成token接口须要配置以下参数:

最后github地址:https://github.com/stulzq/IdentityServer4.Samples/tree/master/Quickstarts/2_ResourceOwnerPasswords 若是你以为对你有用,欢迎star

相关文章
相关标签/搜索