如何通过传递用户名和密码从Identity Server获取访问令牌?

时间:2017-07-29 14:41:57

标签: c# .net automated-tests token identityserver3

我们正在使用身份服务器为我们的Web服务生成令牌。我们也加入了招摇。但我们面临的问题是,要进行API测试自动化,我们需要使用代码段来访问令牌。是否有自动方式通过使用我们用来访问swagger的用户名和密码来获取访问令牌?

3 个答案:

答案 0 :(得分:2)

我解决这个问题的方法是添加客户端凭据客户端,如果有配置的测试客户端密码,我只在测试环境中配置这个秘密,但显然不在更高的环境中,这意味着客户端永远不会被添加到那里。 / p>

因此,在您的appsettings。{proper_environment} .settings中或通过环境变量设置客户端密钥,然后在您的IdentityServer配置中添加:

//attempt to get the test client secret
var testClientSecret = configuration["TestClientSecret"];
if (!String.IsNullOrWhiteSpace(testClientSecret))
{
    clients.Add(new Client
    {
        ClientId = "MyTestClient",

        AllowedGrantTypes = GrantTypes.ClientCredentials,

        ClientSecrets =
        {
            new Secret(testClientSecret.Sha256())
        },

        AllowedScopes = { "MyApiScope", "MyOtherApiScope", "etc." }
    });
};

然后我有一个Postman的测试集合,首先发布到:

https://{{idp_base_url}}/connect/token

使用带有测试客户端名称和密码的用户名的基本身份验证作为客户端密钥(其中{{idp_base_url}}是包含适用于环境的IdentityServer主机的邮递员环境变量。)

然后我运行一些测试,但也将访问令牌存储到API:

//tests...
var tokenData = JSON.parse(responseBody);
//more tests...
postman.setEnvironmentVariable("cc_token", tokenData.access_token);

然后,集合中的后续测试可以使用此令牌和使用上述Postman环境变量的承载令牌auth标头运行API测试:

Postman bearer token

答案 1 :(得分:0)

首先声明一个名为Token的类。

public class Token
{
    [JsonProperty("access_token")]
    public string AccessToken { get; set; }

    [JsonProperty("token_type")]
    public string TokenType { get; set; }

    [JsonProperty("expires_in")]
    public int ExpiresIn { get; set; }

    [JsonProperty("userName")]
    public string Username { get; set; }

    [JsonProperty(".issued")]
    public string IssuedAt { get; set; }

    [JsonProperty(".expires")]
    public string ExpiresAt { get; set; }
}

在邮递员中,我们在POST方法中使用用户名,密码和grant_type来从baseURl / token uri生成access_token。要知道应该使用哪个URL,请检查App_Start文件夹中的Startup.Auth.cs文件。

OAuthOptions = new OAuthAuthorizationServerOptions
{
     TokenEndpointPath = new PathString("/Token"),
     .....
}

适当的URL由PathString()构造函数中的字符串确定。

一旦你知道要调用哪个url,现在要获取访问令牌,请考虑以下代码。

var keyValues = new List<KeyValuePair<string, string>>
{
    new KeyValuePair<string, string>("username", username),
    new KeyValuePair<string, string>("password",password),
    new KeyValuePair<string, string>("grant_type", "password")
};

var request = new HttpRequestMessage(HttpMethod.Post, "baseUrl/Token");

request.Content = new FormUrlEncodedContent(keyValues);

var client = new HttpClient();

var response = await client.SendAsync(request);

var content = await response.Content.ReadAsStringAsync();
var accessTokenVar = JsonConvert.DeserializeObject<AuthenticationToken>(content);

现在可以使用accessTokenVar访问访问令牌。

答案 2 :(得分:0)

另一种方法是使用IdentityModel NuGet获取令牌。示例:

var client = new HttpClient();
var tokenResponse = await client.RequestClientCredentialsTokenAsync(new ClientCredentialsTokenRequest
{
    Address = $"{IdentityServerUrl}/connect/token",
    ClientId = "THE_CLIENT_ID",
    ClientSecret = IdentityServerPass,
    Scope = "api.read"

}).ConfigureAwait(false);
tokenResponse.HttpResponse.EnsureSuccessStatusCode();