asp.net - 重定向后请求中不存在 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 吗?
也许您有使用 CEF Sharp 的经验并且可以理解我在做什么或提出替代方案?
谢谢 :-)
解决方案
正如评论中所指出的,我需要做的就是添加一个简单的标志:
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);
}
}
...我可能会回到原来的解决方案。
任何我满意的人。
推荐阅读
- r - 如何在ggplot R中制作双轴
- mysql - 当一组数据可以来自 2 行或更多行时,使用 OFFSET 和 LIMIT 从 MySQL 表中获取数据集
- regex - 在 RegEx 中的匹配项之间插入字符(连字符)
- windows-10 - 继续检查所有实例版本,即使一个在 python 中引发错误?
- sql - SQL / BQ - 使用合并功能从表中更新应用程序名称
- r - Stat 函数 dnorm 失败
- reactjs - 重构 React 组件的渲染方法会导致错误
- javascript - 按顺序从数组中获取每个项目的最佳方法是什么?
- javascript - 由于事件侦听器,我的变量不是全局变量。我需要他们是全球性的
- javascript - 如何将画布完全堆叠在网络摄像头流的顶部?