首页 > 解决方案 > 重定向后请求中不存在 Set-Cookie 标头

问题描述

这是一个长镜头。
我正在研究将用户的登录凭据传递给CEF Sharp浏览器的解决方案。
我们有一个允许用户登录的 WinForms 应用程序,现在我开发了一个 Web 应用程序,它有自己的登录页面但使用相同的数据库。
我们希望通过 WebBrowser UserControl 将新的 Web 应用程序与现有的 WinForm 结合起来。
因此,我们希望 WebBrowser UserControl 能够意识到用户已经登录,而不必要求用户再次登录。

我开发了一个解决方案,我通过IFrame.LoadRequest将用户凭据发布到 ASP 端点,该端点创建 auth Cookie 并重定向到主页,绕过登录。
但是,Cookie 不会在请求之间持久化。

编辑

这就是我提出请求的方式:

Module NavigateExtensions
    <Extension()>
    Public Sub Navigate(ByVal browser As IWebBrowser, ByVal url As String, postData As Dictionary(Of String, Object))
        Dim frame As IFrame = browser.GetMainFrame()
        Dim request As IRequest = frame.CreateRequest()
        request.Url = url
        request.Method = "POST"
        request.InitializePostData()
        Dim element = request.PostData.CreatePostDataElement()
        Dim content = JsonConvert.SerializeObject(postData)
        element.Bytes = Encoding.UTF8.GetBytes(content)
        request.PostData.AddElement(element)
        Dim headers As NameValueCollection = New NameValueCollection()
        headers.Add("Content-Type", "application/json")
        request.Headers = headers
        frame.LoadRequest(request)
    End Sub
End Module

这是每个请求的两个屏幕截图,第一个返回带有 cookie 集的重定向,但是 cookie 在后续请求中不存在。
我已经取消了域名,但它们是相同的 - 我想知道是否是同源?

使用 cookie 重定向

没有 cookie 的后续请求

有人可以帮我理解为什么没有设置 cookie 吗?
也许您有使用 CEF Sharp 的经验并且可以理解我在做什么或提出替代方案?

谢谢 :-)

标签: asp.nethttpcookiescefsharpchromium-embedded

解决方案


正如评论中所指出的,我需要做的就是添加一个简单的标志:

request.Flags = UrlRequestFlags.AllowStoredCredentials

然而,作为一个不必要的复杂解决方案,我结束了使用带有ExecuteScriptAsync 函数的 JavaScript :

    Private Sub ChromiumWebBrowser1_LoadingStateChanged(sender As Object, e As LoadingStateChangedEventArgs) Handles ChromiumWebBrowser1.LoadingStateChanged

        ChromiumWebBrowser1.ShowDevTools()
        If ChromiumWebBrowser1.CanExecuteJavascriptInMainFrame Then
            Dim postData As New Dictionary(Of String, Object)
            postData.Add("SecurityUser", New SecurityUser With
                         {
                         .UserID = 101,
                         .FirstName = "Bob",
                         .UserName = "bob",
                         .CompleteName = "Bob Bob",
                         .Email = "bob@bob.bob"
                         })
            postData.Add("RedirectUrl", "menu")
            Dim content = JsonConvert.SerializeObject(postData)
            ChromiumWebBrowser1.ExecuteScriptAsync("functions.utils.loginEx", content)
        End If

    End Sub

然后是函数:

    export var loginEx = (args: any) => {
        let obj = parseJSON(args);
        Services.loginEx.request = obj;
    }

我碰巧正在使用使事情复杂化的Blazor,所以我需要一个LoginService注册自身引用的:

        public async Task Check()
        {
            var @ref = DotNetObjectReference.Create(this);
            js.InvokeVoidAsync("functions.utils.registerLoginEx", @ref);
        }

我打电话给index.razor.cs

        protected override async Task OnInitializedAsync()
        {
            LoginExService.Check();
        }

调用的函数:

    export var registerLoginEx = (dotNet: DotNet.DotNetObject) => {
        dotNet.invokeMethodAsync("Login", Services.loginEx.request);
    }

最后是服务中的登录:

        [JSInvokable]
        public async Task Login(SecurityUserRequest request)
        {
            transferService.User = request.SecurityUser;
            await http.LoginEx(request);
            if (!string.IsNullOrWhiteSpace(request.RedirectUrl))
            {
                navigation.NavigateTo(request.RedirectUrl);
            }
        }

...我可能会回到原来的解决方案。
任何我满意的人。


推荐阅读