使用密码保护API

OAuth 2.0资源所有者密码授予允许客户端向令牌服务发送用户名和密码,并获取代表该用户的访问令牌。

规范建议仅对“受信任”(或遗留)应用程序使用资源所有者密码授予。一般来说,当您想要对用户进行身份验证并请求访问令牌时,通常会更好地使用其中一个交互式OpenID Connect流程。

尽管如此,这种授权类型允许我们将用户的概念引入我们的快速启动IdentityServer,这就是我们展示它的原因。

添加用户

就像资源(也称为范围)和客户端的内存存储一样,用户也有一个。

注意

有关如何正确存储和管理用户帐户的详细信息,请查看基于ASP.NET身份的快速入门。

该类TestUser代表测试用户及其声明。让我们通过在config类中添加以下代码来创建几个用户:

首先将以下using语句添加到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()
        .AddDeveloperSigningCredential()
        .AddInMemoryApiResources(Config.GetApiResources())
        .AddInMemoryClients(Config.GetClients())
        .AddTestUsers(Config.GetUsers());
}

AddTestUsers扩展方法做了几件事情引擎盖下

  • 添加对资源所有者密码授予的支持
  • 添加对登录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" }
        }
    };
}

使用密码授权请求令牌

客户端看起来与我们为客户端凭据授予所做的非常相似。主要区别在于客户端会以某种方式收集用户的密码,并在令牌请求期间将其发送到令牌服务。

IdentityModel再次TokenClient可以在这里提供帮助:

// request token
var tokenClient = new TokenClient(disco.TokenEndpoint, "ro.client", "secret");
var tokenResponse = await tokenClient.RequestResourceOwnerPasswordAsync("alice", "password", "api1");

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

Console.WriteLine(tokenResponse.Json);
Console.WriteLine("\n\n");

将令牌发送到身份API端点时,您会注意到与客户端凭据授权相比有一个小但重要的区别。访问令牌现在将包含sub唯一标识用户的声明。通过在调用API之后检查内容变量可以看到这个“子”声明,并且控制器应用程序也会在屏幕上显示该声明。

声明的存在(或不存在)sub允许API区分代表客户的呼叫和代表用户的呼叫。

nidie.com.cn - 用心与你沟通