servicestack,identityserver4,Authentication,Asp.net Core,servicestack,Identityserver4" /> servicestack,identityserver4,Authentication,Asp.net Core,servicestack,Identityserver4" />

Authentication 使用ASP.NET核心和服务堆栈进行身份验证和授权

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头中的承载令

我有一个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)

我走的方向对吗?欢迎提出任何建议


谢谢

您可以在此处找到您的场景示例:

授权代码仅用于从identity server获取访问令牌,而不用于对API进行身份验证

以下是流程应该如何工作:

  • 用户在Identity Server上登录
  • 您的MVC应用程序将获得授权代码和id令牌
    • id令牌告诉您的MVC应用程序用户是谁
  • 授权码与API的identity server交换为访问令牌和刷新令牌
  • 现在,MVC应用程序可以使用访问令牌从其后端进行HTTP调用
  • 身份验证cookie已创建并返回给用户
  • 前端将身份验证cookie与每个请求一起提交到MVC后端,MVC后端会自动验证每个到达MVC的请求,然后当您想从那里调用API时,按照文档中所示获取它,并将其附加到您的请求中

  • 我认为您在这里缺少的一点是,一旦用户登录,当您返回客户端应用程序时,您也将在响应中获得访问令牌。如果您使用的是混合流,在客户端应用程序上,我们将其配置为

    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提供的示例。我相信你不会有任何问题的。