2

我知道很多人可能不同意这种实现,但我希望将 jwt 存储在仅限 http 的容器中,以防止 javascript 访问令牌。一旦用户通过身份验证,.NET 应用程序就会从 Identity Server 检索 Jwt。然后我想创建一个仅限 http 的 cookie 并将 jwt 存储在其中,然后将其发送到 api 进行授权。

我想问我如何将此cookie发送到api以及如何让api访问cookie中的jwt并使用身份服务器进行身份验证(我知道我可以使用身份服务器上的自省端点来检查是否jwt 有效)。

我目前正在尝试使用 RestSharp 从应用程序发送请求:

var oClient = new RestClient("http://localhost:52298/stockcontrol/availablestock");
            var oContainer =  new CookieContainer();
            var oRequest = new RestRequest();
            oRequest.Method = Method.GET;

            var oCookie = new Cookie("Jwt", sJwt) { HttpOnly = true, Expires = DateTime.Now.AddMinutes(10), Domain = "test" };

            oContainer.Add(oCookie);
            oClient.CookieContainer = oContainer;
            

            var oResponse = oClient.Execute(oRequest);

这是我试图用来验证 api 上的 jwt 的代码:

app.UseCookieAuthentication(new CookieAuthenticationOptions()
            {
                Provider = new CookieAuthenticationProvider()
                {
                    OnValidateIdentity = async context =>
                    {
                        if (context?.Identity?.IsAuthenticated ?? false)
                        {
                            var accessToken = context?.Identity?.Claims?.FirstOrDefault(x => x.Type == "access_token")?.Value;
                            if (accessToken == null)
                            {
                                context?.RejectIdentity();
                            }
                            else
                            {
                                var client = new IntrospectionClient(
                                        sISUrl + "connect/introspect",
                                        sISClientName,
                                        sISClientSecret); // auth as scope, not client!
                                var validationResult = await client.SendAsync(new IntrospectionRequest()
                                {
                                    Token = accessToken
                                });

                                if (validationResult.IsError || !validationResult.IsActive)
                                {
                                    context?.RejectIdentity();
                                }
                            }
                        }
                    }
                }
            });

4

0 回答 0