如何向身份服务器本身颁发访问令牌?
How can I issue an access token to the identityserver itself?
这可能是一个愚蠢的问题,但这里是 :)
我在这个问题上有以下应用:
- 一个 IdentityServer3
- 使用 Identityserver 作为其身份验证器的 WebApi2 应用程序
- MVC 网络应用程序
我想做的是从 IdentityServer 调用 WebApi 上的安全服务,但为此我需要一个访问令牌。
如何在 IdentityServer 中向其自身发出访问令牌(该令牌将通过自身从 WebApi 进行身份验证)
我有相同或非常相似的要求。在我的例子中,用户请求令牌并使用外部 IdP 进行身份验证(这是使用 authcode 流程)。在用户身份验证过程之后,我需要 IdentityServer 联系受保护的 WebApi - 这样做 IdentityServer 需要一个令牌(使用客户端凭证流)
我当前的解决方案(但我仍在测试)是在 AutenticateExternalAsync 中对自定义用户服务进行调用。在这里,我使用 TokenClient.RequestClientCredentialsAsync 进行调用。显然,客户端需要为 IdentityServer 本身进行设置。
早期迹象表明这在开发环境中按预期工作。
我听从了@Andy 的建议,它对我有用:) 在这里发布我的代码以供其他人查看。以下代码在自定义用户服务中实现。
public override Task AuthenticateLocalAsync(LocalAuthenticationContext context)
{
var user = GetUsersAsync().SingleOrDefault(x => x.Username == context.UserName && x.Password == context.Password);
if (user != null)
{
context.AuthenticateResult = new AuthenticateResult(user.Subject, user.Username);
}
return Task.FromResult(0);
}
private static List<CustomUser> GetUsersAsync()
{
var response = GetTokenAsync();
var result = CallUserApi(response.Result.AccessToken).Result;
var users = JsonConvert.DeserializeObject<List<CustomUser>>(result);
return users;
}
private static Task<string> CallUserApi(string token)
{
var client = new HttpClient();
client.SetBearerToken(token);
var json = client.GetStringAsync($"https://your.apiAdress.here/");
return json;
}
private static Task<IdentityModel.Client.TokenResponse> GetTokenAsync()
{
var client = new TokenClient(
"https://identityserver.adress.here/identity/connect/token",
"clientId",
"secret");
return client.RequestClientCredentialsAsync("apiScope");
}
IdentityServer 包含一个 OWIN 扩展方法,允许直接发行令牌 - 无需通过其中一个协议流。
它被称为 IssueClientToken
并在此处记录:
https://identityserver.github.io/Documentation/docsv2/advanced/owin.html
这可能是一个愚蠢的问题,但这里是 :)
我在这个问题上有以下应用:
- 一个 IdentityServer3
- 使用 Identityserver 作为其身份验证器的 WebApi2 应用程序
- MVC 网络应用程序
我想做的是从 IdentityServer 调用 WebApi 上的安全服务,但为此我需要一个访问令牌。
如何在 IdentityServer 中向其自身发出访问令牌(该令牌将通过自身从 WebApi 进行身份验证)
我有相同或非常相似的要求。在我的例子中,用户请求令牌并使用外部 IdP 进行身份验证(这是使用 authcode 流程)。在用户身份验证过程之后,我需要 IdentityServer 联系受保护的 WebApi - 这样做 IdentityServer 需要一个令牌(使用客户端凭证流)
我当前的解决方案(但我仍在测试)是在 AutenticateExternalAsync 中对自定义用户服务进行调用。在这里,我使用 TokenClient.RequestClientCredentialsAsync 进行调用。显然,客户端需要为 IdentityServer 本身进行设置。
早期迹象表明这在开发环境中按预期工作。
我听从了@Andy 的建议,它对我有用:) 在这里发布我的代码以供其他人查看。以下代码在自定义用户服务中实现。
public override Task AuthenticateLocalAsync(LocalAuthenticationContext context)
{
var user = GetUsersAsync().SingleOrDefault(x => x.Username == context.UserName && x.Password == context.Password);
if (user != null)
{
context.AuthenticateResult = new AuthenticateResult(user.Subject, user.Username);
}
return Task.FromResult(0);
}
private static List<CustomUser> GetUsersAsync()
{
var response = GetTokenAsync();
var result = CallUserApi(response.Result.AccessToken).Result;
var users = JsonConvert.DeserializeObject<List<CustomUser>>(result);
return users;
}
private static Task<string> CallUserApi(string token)
{
var client = new HttpClient();
client.SetBearerToken(token);
var json = client.GetStringAsync($"https://your.apiAdress.here/");
return json;
}
private static Task<IdentityModel.Client.TokenResponse> GetTokenAsync()
{
var client = new TokenClient(
"https://identityserver.adress.here/identity/connect/token",
"clientId",
"secret");
return client.RequestClientCredentialsAsync("apiScope");
}
IdentityServer 包含一个 OWIN 扩展方法,允许直接发行令牌 - 无需通过其中一个协议流。
它被称为 IssueClientToken
并在此处记录:
https://identityserver.github.io/Documentation/docsv2/advanced/owin.html