Authentication 使用ASP.NET核心和服务堆栈进行身份验证和授权
我有一个ASP.Net核心MVC Web应用程序,用户需要登录以从IdentityServer4获取id_令牌,然后该id_令牌将传递给ServiceStack中实现的webapi以获取授权代码。对webapi的后续调用将使用授权代码 到目前为止,我读到的是Web应用程序,它应该使用openid cookie令牌(UseOpenIdConnectAuthentication)。对于webapi,它应该使用承载令牌。我的问题是如何从客户端浏览器将仅http的cookie令牌作为http头中的承载令牌传递。由于cookie仅为http,Javascript无法访问它。此外,ASP.NET核心cookie中间件对cookie进行加密,ServiceStack webapi能否对加密的cookie进行解密(如果cookie被传递到webapi) 我走的方向对吗?欢迎提出任何建议Authentication 使用ASP.NET核心和服务堆栈进行身份验证和授权,authentication,asp.net-core,
servicestack,identityserver4,Authentication,Asp.net Core,
servicestack,Identityserver4,我有一个ASP.Net核心MVC Web应用程序,用户需要登录以从IdentityServer4获取id_令牌,然后该id_令牌将传递给ServiceStack中实现的webapi以获取授权代码。对webapi的后续调用将使用授权代码 到目前为止,我读到的是Web应用程序,它应该使用openid cookie令牌(UseOpenIdConnectAuthentication)。对于webapi,它应该使用承载令牌。我的问题是如何从客户端浏览器将仅http的cookie令牌作为http头中的承载令
谢谢您可以在此处找到您的场景示例: 授权代码仅用于从identity server获取访问令牌,而不用于对API进行身份验证 以下是流程应该如何工作:
- id令牌告诉您的MVC应用程序用户是谁
我认为您在这里缺少的一点是,一旦用户登录,当您返回客户端应用程序时,您也将在响应中获得访问令牌。如果您使用的是混合流,在客户端应用程序上,我们将其配置为
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
});
请参阅响应类型我们请求代码,即访问代码。因此,您无需再次呼叫或登录。一旦你想调用你的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));
}
如果您使用隐式流,您的前端可以使用oidc客户端库获取访问令牌,user.access\u令牌将拥有它。感谢您的回复。我想澄清一下,MVC应用程序客户端(浏览器)将直接调用webapi,而不是通过MVC应用程序,我认为这就是该示例正在做的事情,以及步骤6(从那里调用API)正在做的事情。是否可以直接调用webapi,而不是通过MVC应用程序。此外,webapi使用的ServiceStack没有ASP.NET Core,它如何解密ASP.NET Core加密的cookie。该API在示例中由MVC应用程序的后端调用。然后,您需要的可能是使用隐式授权流。cookie是为您的MVC应用程序准备的,无需将其发送到API。您的前端需要获取API的访问令牌,以便将其附加到AJAX请求头。对,问题是“前端需要如何获取API的访问令牌”?要获取API的访问令牌,前端需要首先将标识传递给API,对吗?id令牌的作用是什么?但是,如果从MVC应用程序获得的id令牌在cookie中加密,如何检索并传递给API。或者你的意思是API的访问令牌是通过MVC应用程序获得的?不,id令牌不是用于API的。您从identity server获得一个访问令牌,该令牌还包含用户信息。您的API检查令牌的签名,并从中获取调用用户的信息。由于您的调用将直接从前端转到API,因此您的情况是:如果使用混合响应类型并从MVC应用程序获取代码和id_令牌,请更正我的错误,这将是MVC应用程序的访问令牌,不是webapi的访问令牌,对吗?MVC应用程序的访问令牌将是您用来访问web api的。两者都是一样的。想想看,为什么MVC应用程序需要访问令牌。访问令牌用于web API等安全资源。尝试官方文件提供的示例示例或@juunas提供的示例。我相信你不会有任何问题的。