当前位置: 首页 > 知识库问答 >
问题:

如何使用C#从Identity Server 4中正确获取令牌,以便在Postman中使用?

华俊贤
2023-03-14

我正在执行以下C#魔法,并读取在jwt.io中获得的标记。一切看起来都很好。

DiscoveryResponse vasco = DiscoveryClient.GetAsync("http://localhost:5100").Result;
string tokenUri = vasco.TokenEndpoint;

TokenClient client = new TokenClient(vasco.TokenEndpoint, "Blopp", "SuperSecret");
TokenResponse cred = client.RequestClientCredentialsAsync("secured_api").Result;
string token = cred.AccessToken ?? "none!";

然而,它似乎并不是一个完全运行良好的,因为当使用密钥授权和值承载令牌(前缀是手动标记的)粘贴到邮递员时,我进入了不可访问的服务(如本问题所讨论的)。

在终结点上使用相同的凭据 http://localhost:5100/connect/token 和 Postman 的基于 OAuth 2.0 的向导,将生成一个有效的令牌。

我的结论是,我不知何故没有使用我的代码获取正确的令牌(并且由于无知而没有意识到它),或者我获取的令牌缺少某些东西。

我如何获取正确的令牌,完整且完全等同于邮递员在上面的URL中获得的令牌?

共有1个答案

宋唯
2023-03-14

我的结论是,我不知何故没有使用我的代码获取正确的令牌(并且由于无知而没有意识到它),或者我获取的令牌缺少某些东西。

从您的代码中,您正在使用客户端凭据保护API,因此首先请按照文章中的详细步骤配置身份服务器,Web api和客户端。

为了进行测试,我遵循本文中的步骤,并使用与您所示相同的代码来获取令牌:

        // discover endpoints from metadata
        var disco = await DiscoveryClient.GetAsync("http://localhost:5000");
        if (disco.IsError)
        {
            Console.WriteLine(disco.Error);
            return;
        }

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

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

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

“http://localhost:5000”是身份服务器的主机endpoint,clinet/secret 是我的客户端的凭据:

 public static IEnumerable<Client> GetClients()
 {
  return new List<Client>
  {
    new Client
    {
        ClientId = "client",

        // no interactive user, use the clientid/secret for authentication
        AllowedGrantTypes = GrantTypes.ClientCredentials,

        // secret for authentication
        ClientSecrets =
        {
            new Secret("secret".Sha256())
        },

        // scopes that client has access to
        AllowedScopes = { "api1" }
    }
};
}

您还可以在使用基于OAuth 2.0的向导时比较获取令牌请求,并确认您正在使用客户端凭据流。

 类似资料:
  • 我正在尝试使用邮递员应用程序从keycloak获取访问令牌。我使用的流是身份验证代码流。URI am提供的身份验证是 http://localhost:8080/auth/realms/realm_name/openid-connect/token 即使在keycloak中,我在clients下的Security-admin-console中将有效的重定向URI修改为http://localhos

  • 我使用Azure AD作为具有IdentityServer4的外部IdP。要调用受AzureAd保护的API,我需要从Azure Ad获取访问令牌。是否可以在登录过程中获取访问令牌并将其保存到声明中? 我正在使用IdentityServer4快速启动UI。我试图在外部令牌的回调方法中捕获访问令牌,但在HttpContext或声明或ProcessLoginCallbackForOidc方法中没有找到

  • 在我的web应用程序中,我使用Firebase进行身份验证,要访问任何API,我必须从Firebase进行身份验证。 问题:如何在Postman中获取firebase的访问令牌? 我有两种解决此问题的方法: 1) 在postman中从firebase获取访问令牌,并将该访问令牌存储在postman global env中。变量,然后我可以执行其他API请求。(这里我不知道如何在邮递员那里获得访问令

  • 我正在尝试使用Web服务。我需要获取令牌并在授权标头中发送此令牌,我正在获取令牌,但在服务器中存在问题,因为令牌是v1并且他们正在使用v2。 这是我用来获取代码的网址 https://login.microsoftonline.com/tenant/oauth2/v2.0/authorize?response_type=code 这是获取令牌的url https://login.microsoft

  • 目标 能够运行集合,而无需在运行集合之前逐个完成每个调用的授权过程。 我所尝试/注意到的 > 在Postman中使用OAuth2授权助手时,我没有发现保存返回的刷新令牌的方法,因此在访问令牌到期时使用它来获取新的令牌。(我建议将此功能放在Postman Github问题中的助手中。) 我尝试在集合开始时创建几个步骤来复制助手,但无法通过需要用户交互来批准/拒绝的步骤(这是有道理的,因为否则会带来安

  • 我正在从事一个需要oauth2令牌才能进行通信的项目。后端给了我一个curl命令,但我不知道如何在Unity中将其转换为WWW格式,因为我以前没有使用http或json文件的经验。你能帮我取一下代币吗?谢谢下面是curl代码的样子: $curl-v-u{CLIENT_ID}:{CLIENT_SECRET}”https://api.domo.com/oauth/token?grant_type=cl