我使用asp.net做了一个网站,我已经设置了一个登录功能,使用OpenID,特别是Steam。我有一个被调用的web API,它处理开放id的挑战。当用户单击sign in时,它会打开一个新的选项卡和浏览器,并引导他们登录api点。在我的本地pc上,它可以完美地工作,但在Azure上的托管应用程序服务上却不能。当窗口打开时,它不调用API。调用API的唯一方法是清除缓存(Shift + Ctrl + R),然后重新加载页面,调用API,它工作完美。如果我不清除缓存,它只是一个空白页。
下面是API 的代码[HttpPost("api/signin"), HttpGet("api/signin")]
public async Task<IActionResult> SignIn(string type)
{
string provider = type;
// Note: the "provider" parameter corresponds to the external
// authentication provider choosen by the user agent.
if (string.IsNullOrWhiteSpace(provider))
{
return BadRequest();
}
if (!await HttpContext.IsProviderSupportedAsync(provider))
{
return BadRequest();
}
// Instruct the middleware corresponding to the requested external identity
// provider to redirect the user agent to its own authorization endpoint.
// Note: the authenticationScheme parameter must match the value configured in Startup.cs
return Challenge(new AuthenticationProperties { RedirectUri = "api/saveuser" }, provider);
}
下面是当按下按钮时打开新窗口并指向API的函数代码。
handleLoginSteam = () => {
let winHeight = window.screen.height / 1.5;
let winWidth = window.screen.width / 3;
const win = window.open(
'/api/signin?type=Steam',
'Discord Sign In', "height=" + winHeight + ",width=" + winWidth + ",top=" + ((window.screen.height - winHeight) / 2) + ",left=" + ((window.screen.width - winWidth) / 2));
win.opener.location.reload();
const timer = setInterval(() => {
if (win.closed) {
clearInterval(timer);
this.fetchUserData();
}
}, 500);
}
这是新窗口没有调用api
的图片此时按ctrl + shift + r是调用蒸汽登录的唯一方法。
我尝试添加一个随机参数的链接,传递到窗口停止缓存,但它不工作!如果有人能帮助我,我将不胜感激。我对asp.net还是个新手。
通过代码似乎你正试图实现打开新窗口,并指向Signin API时,按下一个按钮和refreshparentwinwindow任务。现在,根据您的代码,让我们逐行查看您的代码。
这是打开一个弹出窗口的代码。
const win = window.open(
'/api/signin?type=Steam',
'Discord Sign In', "height=" + winHeight + ",width=" + winWidth + ",top=" + ((window.screen.height - winHeight) / 2) + ",left=" + ((window.screen.width - winWidth) / 2));
在同一页(我假设)你有
win.opener.location.reload(); //this will refresh the parent window
const timer = setInterval(() => {
if (win.closed) {
clearInterval(timer);
this.fetchUserData();
}
}, 500);
}
setInterval()以指定的间隔重复语句。现在,您正在使用这行代码检查窗口是否仍然打开。
if (win.closed)
每秒钟检查一次,即使窗口关闭!
参考:https://www.w3schools.com/jsref/prop_win_closed.asp
现在按照以下步骤:
- 使用父页面上的脚本打开子窗口(你已经有它了) 删除检查窗口是否关闭的代码。无论如何,你都不需要它。
- 当你完成从子窗口添加新记录时,调用这些语句。
opener.location.reload(); //This will refresh parent window.
window.close(); //Close child window. You may also use self.close();
以上两行将写在子页上。也许在按钮上点击。
<input type="button" onclick="Signin()" value="Signin" />
function AddRecord(){
//Add newrecord.
opener.location.reload(); //This will refresh parent window.
window.close(); //Close child window. You may also use self.close();
}
参考:https://www.codeproject.com/Questions/1097734/How-to-reload-refresh-the-parent-window-after-chil