我正在使用CefSharp.Wpf
在WPF中显示我的Angular SPA。
我的身份验证基于 JWT 令牌,这些令牌存储在浏览器本地存储中。我调用带有CefSharp的对话框并登录(将JWT保存在本地存储中)。
然后,我希望我的 c# 应用能够对 API 的受保护资源进行 api 调用。为此,我需要从本地存储中检索令牌并将其添加到请求标头中。
但是我找不到使用客户端 c# 代码从本地存储获取数据的方法。 我该如何实现?
CEF
没有为此提供任何API
,因此您可以使用JS
或使用sqlLite
在磁盘上处理.localstorage
文件。
我已经通过调用JS
代码实现了对LocalStorage
的操作。这篇文章帮助很大:https://blog.logrocket.com/the-complete-guide-to-using-localstorage-in-javascript-apps-ba44edb53a36/
就我而言
var _browser = new ChromiumWebBrowser();
JS包装器:
public void RunJavascript(string script)
{ //semicolumn at the end is not needed, multiple semicolons don't cause error
_browser.GetMainFrame().ExecuteJavaScriptAsync(script);
}
public dynamic RunEvaluateJavascript(string script)
{
string scriptTemplate = @"(function () {
return " + script + ";" +
"})();";
Task<JavascriptResponse> t = _browser.GetMainFrame().EvaluateScriptAsync(scriptTemplate);
t.Wait();
return t.Result.Result;
}
public string RunEvaluateJavascriptToString(string script)
{
var res = RunEvaluateJavascript(script);
return res == null ? null : res.ToString();
}
本地存储功能:
public Dictionary<string, string> GetAllLocalStorageVariables()
{
dynamic res = RunEvaluateJavascript("{ ...localStorage };");
Dictionary<string, string> dictRes = null;
try
{
var dictTmp = new Dictionary<string, object>(res);
dictRes = dictTmp.ToDictionary(k => k.Key, k => k.Value.ToString());
}
catch
{
return null;
}
return dictRes;
}
public string GetLocalStorageValue(string key)
{
return RunEvaluateJavascriptToString($"window.localStorage.getItem('{key}');");
}
public void SetLocalStorageVariable(string key, string value)
{
RunJavascript($"window.localStorage.setItem('{key}', '{value}');");
}
public void ClearLocalStorage()
{
RunJavascript("window.localStorage.clear();");
}
public void RemoveLocalStorageKey(string key)
{
RunJavascript($"window.localStorage.removeItem('{key}');");
}
我也遇到了这个问题,这是我研究的结果.
首先,CEF
不提供这样的 API
.
但是我们可以使用 JavaScript 对象绑定来实现这个函数.
步骤 1:在 C# 中注册一个 JavaScript 对象,如下所示:
JavascriptObjectRepository.Register("localStorage_hook", LocalStorage);
实现存储的一些方法,例如
public object GetItem (string host, string key);
setp 2:在javascript中 删除原始的localStorage对象,如下所示:
cefSharp.deleteBoundObject ('localStorage');
并绑定我们的对象
cefSharp.bindObjectAsync('localStorage_hook');
集合 3:在 javascrti 中创建一个 Proxy 对象来传输和实现 localStorage 的属性和方法,如下所示:
localStorage = new Proxy({
get length() { return localStorage_hook.getItemsCount(location.origin); },
key: function (idx) { return localStorage_hook.getKey(location.origin, idx); },
getItem: function (key) {return localStorage_hook.getItem(location.origin, key);},
setItem: function (key, value) {return localStorage_hook.setItem(location.origin, key, value);},
removeItem: function (key) {return localStorage_hook.removeItem(location.origin, key);},
clear: function () {return localStorage_hook.clearItems(location.origin);}
},
{
get(obj, name) {
if (obj[name]) {
return obj[name];
} else {
return obj.getItem(name);
}
},
set(obj, name, value) {
obj.setItem(name, value);
}
});