這可能是一個愚蠢的問題,但在這裏不用:)我如何向身份服務器本身發出訪問令牌?
我在這個問題以下應用:
- 的IdentityServer3
- 一個WebApi2應用程序,它使用Identityserver作爲其認證
- MVC網絡應用程序
我想要做的是從身份服務器調用WebApi上的安全服務,但在爲了做到這一點,我需要一個訪問令牌。
我如何IdentityServer問題內的訪問令牌本身(爲了將通過自身從的WebAPI被認證)
這可能是一個愚蠢的問題,但在這裏不用:)我如何向身份服務器本身發出訪問令牌?
我在這個問題以下應用:
我想要做的是從身份服務器調用WebApi上的安全服務,但在爲了做到這一點,我需要一個訪問令牌。
我如何IdentityServer問題內的訪問令牌本身(爲了將通過自身從的WebAPI被認證)
IdentityServer包含一個OWIN擴展方法,允許直接發佈令牌 - 無需通過其中一個協議流。
這就是所謂的IssueClientToken
並記錄在這裏:
https://identityserver.github.io/Documentation/docsv2/advanced/owin.html
我有相同或非常相似的要求。在我的情況下,用戶請求令牌並使用外部IdP進行驗證(這是使用授權碼流)。在用戶身份驗證過程之後,我需要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");
}
標記此爲正確答案,工作就像一個魅力:) – Lundsern