【问题标题】:Admins having to reload page to see admin features (question about cookie location)管理员必须重新加载页面才能查看管理员功能(关于 cookie 位置的问题)
【发布时间】:2023-03-21 03:31:01
【问题描述】:

我正在创建一个自定义 cookie,并重载了 Iprincipal 类和所有这些好东西。我的 cookie 工作正常,我能够成功检索用户的角色,但管理员必须在登录后重新加载默认页面才能看到仅限管理员的按钮。一旦他们访问了我网站上的新页面并返回到默认页面,按钮就在那里。

我在某处读到 cookie 是最后创建的,它与对 HTTP 的响应有关。 TBH,我是这个东西的新手,不明白它是如何工作的,但我知道它是如何影响我的程序的。

我目前正在我的默认页面的页面加载中创建和植入我的 cookie。我应该在其他地方做吗,也许是在登录页面?我试过了,但同样的问题仍然存在。我错过了什么吗?

感谢您的帮助,我非常乐意澄清任何事情。

【问题讨论】:

    标签: c# asp.net authentication cookies login


    【解决方案1】:

    您可以尝试设置 cookie 和重定向。这是登录期间的标准做法。重定向将导致新的页面加载,在此期间您的 cookie 将被发送到服务器。

    【讨论】:

    • 好的,这就是我正在考虑的事情。我知道这是一个微不足道的问题,但是在不创建重定向循环的情况下最好的方法是什么?感谢您的回答,我很感激。
    • 好的,我想出了一个办法。我刚刚检查了已经登录的用户是否具有一般用户角色,所有用户都是,如果不是,我重新加载了页面。这样我只会在 cookie 没有生效并且不会创建重定向循环的情况下重新加载页面。再次感谢您的解决方案。我会尽快接受。
    【解决方案2】:

    当我开始使用 ASP.NET 时,我经常遇到类似的问题。问题是我在点击按钮后没有正确绑定数据:

    错误代码:

    void Page_Load(object o, EventArgs e)
    {
        _adminControls.Visibile = IsAdmin();
    }
    
    void Login_Clicked(object o, EventArgs e)
    {
        DoLogin();
    }
    

    解决方法是:

    void Page_Load(object o, EventArgs e)
    {
        // Move binding code, etc to a BindData function and only call it if !IsPostBack
        if (!IsPostBack)
        {
            BindData();
        }
    }
    
    void BindData()
    {
        _adminControls.Visibile = IsAdmin();
    }
    
    void Login_Clicked(object o, EventArgs e)
    {
        DoLogin();
        BindData(); // Call BindData function after login
    }
    

    这可能不是您所看到的,但症状相似。

    【讨论】:

    • 感谢您抽出宝贵的时间来写这篇文章。我明白你在说什么,并且在结束我的程序时会记住这个问题。祝你有美好的一天。
    【解决方案3】:

    Cookie 由服务器在后续 HTTP 响应中设置和读取。

    您可以尝试在同一页面中嵌入 iframe 或其他发送它的东西。

    这就是我所做的,例如: 1.我让页面用户直接登陆。 Cookie 已设置。但是对于这个页面,服务器无法读取 cookie,因为它需要重新加载。

    1. 我可以强制使用不同的随机字符作为 GET 参数重新加载 http,但这很难看(因为使用 GET 参数重新加载的页面会被索引,并产生不必要的复杂性)

    2. 在登录页面上,我想根据设置的 cookie 显示内容(或者如果没有 cookie,则显示替代内容)

    //in the head tags:
     $(document).ready(function(){
                            $("#my_div").load("/MYajax/footer_links.html", function(responseTxt, statusTxt, xhr){
                                if(statusTxt == "success")
                                  console.log("my_div loaded successfully!");
                                if(statusTxt == "error")
                                  console.log ("my_div Error: " + xhr.status + ": " + xhr.statusText);
                              });
     });
    

    然后在页面的某处:

    <div id="my_div"></mydiv>
    

    在 /path/myfile.html 中,对存在或不存在的 cookie 做任何你想做的事情

    基本上使用 jquery 加载,有一个新的 http 请求发送到 /path/myfile.html 并读取 cookie,如果有的话。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-08
      • 1970-01-01
      • 1970-01-01
      • 2012-03-31
      • 2022-08-18
      • 2018-06-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多