我有一个ASP.Net核心MVC Web应用程序,用户需要登录才能从IdentityServer4获取id_token,然后将id_token传递给ServiceStack中实现的webapi以获取授权代码。随后对webapi的调用将使用授权码。
到目前为止,我所读到的是Web App,它应该使用openid cookie令牌(UseOpenIdConnectAuthentication)。对于webapi,它应该使用持票令牌。我的问题是如何将来自客户端浏览器的仅http cookie令牌作为http标头中的承载令牌传递。由于cookie仅为http,因此无法通过Javascript访问。此外,ASP.NET Core cookie中间件加密cookie,ServiceStack webapi可以解密加密的cookie(如果cookie传递给webapi)吗?
我是朝着正确的方向前进的吗?欢迎提出任何建议。
由于
答案 0 :(得分:2)
您可以在此处找到您的方案示例:https://identityserver4.readthedocs.io/en/release/quickstarts/5_hybrid_and_api_access.html
授权代码仅用于从身份服务器获取访问令牌,不用于对API进行身份验证。
以下是 流的工作方式:
答案 1 :(得分:0)
我认为您在此处缺少的一点是,一旦用户登录,当您重新登陆客户端应用程序时,您将在响应中获得访问令牌。如果您使用的是Hybrid Flow,请在客户端应用中将其配置为
app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions
{
AuthenticationScheme = "oidc",
SignInScheme = "Cookies",
Authority = "http://localhost:5000",
RequireHttpsMetadata = false,
ClientId = "mvc",
ClientSecret = "secret",
ResponseType = "code id_token",
Scope = { "api1", "offline_access" },
GetClaimsFromUserInfoEndpoint = true,
SaveTokens = true
});
请参阅我们要求代码的 ResponseType ,即访问代码。所以你不需要再打电话或登录。一旦你想打电话给你的api,就得到像
这样的令牌var access_token = await HttpContext.Authentication.GetTokenAsync("access_token");
// call api
var client = new HttpClient();
client.SetBearerToken(access_token);
var response = await client.GetAsync("http://localhost:5001/identity");
if (!response.IsSuccessStatusCode)
{
Console.WriteLine(response.StatusCode);
}
else
{
var content = await response.Content.ReadAsStringAsync();
Console.WriteLine(JArray.Parse(content));
}
如果您使用Implicit流,您的前端可以使用oidc-client库获取访问令牌,而user.access_token将拥有它。