2017-07-29 87 views

回答

1

我解决这个问题的方法是添加一个客户端凭证客户端,如果存在已配置的测试客户端密钥,我只在测试环境中配置此密钥,但明显不在较高的环境中,意味着客户端永远不会被添加到那里。 。

所以,无论是在你的AppSettings {} appropriate_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." } 
    }); 
}; 

然后,我有一个测试的邮差集合其中第一POST到:

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); 

集合在随后的测试,那么可以使用此令牌使用上述承载令牌身份验证头运行的API测试邮差环境变量:

所有的

Postman bearer token

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; } 
} 

在Postman中,我们在POST方法中使用username,password和grant_type来从baseURl/token uri生成access_token。要知道您应该使用哪个网址,请检查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访问访问令牌。

相关问题