【问题标题】:SimpleMembership with ASP.Net Web application (NO MVC, NO RAZOR. Just standard .net web project)SimpleMembership 与 ASP.Net Web 应用程序(没有 MVC,没有 RAZOR。只是标准的 .net Web 项目)
【发布时间】:2013-01-03 03:50:40
【问题描述】:

我在项目中实施 SimpleMembership 时遇到问题。基本上,我找不到任何有关限制访问页面的信息。这是我到目前为止所做的:

  1. 我的登录页面名为 default.aspx。通过将其添加到 web.config,我已经能够将 SimpleMembership 配置为识别 default.aspx 作为我的登录页面:
<appSettings>
    <add key="loginUrl" value="default.aspx" />
</appSettings>
  1. 我的 default.aspx 中有一个 WebMethod,用于通过 WebSecurity.Login 验证用户凭据。我正在通过 jquery ajax 调用 WebMethod:
[WebMethod, ScriptMethod]
public static bool Login(string userName, string password)
{
    return SecurityManager.Instance.Login(userName: userName, password: password);
}
  1. 在我的 jquery 代码的 ajax 成功处理程序中,我将用户重定向到另一个应受保护的页面 (home.aspx):
success: function (data, textStatus, jqXHR) {
    if (data.d) {
        window.location.href = "home.aspx";
    }
    else {
        $("#invalidCredentialsBox").css("visibility", "visible");
    }
},

问题是,如果我尝试直接(从浏览器)访问 home.aspx,它实际上会加载。那么,我该怎么做才能让 SimpleMembership 限制对 home.aspx 的访问,直到用户成功登录?

我不得不做的,不知道这是否是正确的解决方案,它是在 app_code 文件夹中创建一个基类。该类继承自 System.Web.UI.Page,然后我将 home.aspx 更改为从该基类继承。在基类的构造函数中,我正在检查 WebSecurity.IsAuthenticated 属性,如果它是 false,那么我执行 Response.Redirect 到我的 error.aspx 页面:

namespace MyProject
{
    public class BasePage : System.Web.UI.Page
    {
        public BasePage()
        {
            if (!SecurityManager.Instance.IsAuthenticated())
            {
                HttpContext.Current.Response.Redirect("error.aspx");
            }
        }
    }
}

以这种方式,它可以工作,但我不认为这是实现它的正确方式。我发现的所有示例都使用 MVC,但我不是,实际上我对 MVC 几乎一无所知。能否请人提供一些想法或指出 SimpleMembership 与 .net Web 项目一起使用的相同文档/示例?

另外,还有哪些其他属性对 SimpleMembership 有效,我可以添加到 web.config 的 appSettings 部分?而且,如何设置 web.config 的身份验证部分以使用 SimpleMembership(我在 MVC 4 模板中看到,即使它使用 SimpleMembership,它仍然在 web.config 中设置表单身份验证部分)

谢谢。

【问题讨论】:

    标签: asp.net web-applications security simplemembership


    【解决方案1】:

    不要将授权与身份验证混淆。

    授权决定谁可以访问什么。

    可以如下设置

    <authorization>
      <allow users="Kim"/>
      <allow roles="Admins"/>
      <deny users="John"/>
      <deny users="?"/>
    </authorization>
    

    参考:Asp.net Authorization

    会员提供者负责authentication。它的职责只是验证用户是他声称的那个人。

    如果您网站的某个部分需要不同的授权规则,例如登录页面、默认页面或每个人都可以访问的公共文件夹,您可以使用location 元素为其创建一个部分。

    这将允许所有用户访问 Logon.aspx,即使站点的其余部分受到限制。

       <location path="Logon.aspx">
          <system.web>
             <authorization>
                <allow users="*"/>
             </authorization>
          </system.web>
       </location>
    

    【讨论】:

    • 谢谢,nunespascal。那么,如何使用 SimpleMembership 方法和属性来构建自己的授权逻辑?并确保没有人可以通过在浏览器中输入页面名称来访问页面?我了解您发送的设置在用户及其有权访问的选项存储在数据库中的实际应用程序中不起作用。也就是说,我该如何做SimpleMembership来实现授权逻辑?
    • 您不能为此使用 SimpleMembership 方法。虽然我提供了硬编码的用户名,但您的用户名可以来自数据库。像&lt;deny users="?"/&gt; 这样的规则将拒绝匿名用户,因此只有经过身份验证的用户才能访问资源(文件或文件夹)。
    • 是的,我尝试过使用&lt;deny users="?"/&gt;,但随后我的登录页面 (default.aspx) 也受到了限制。即使我在 appSettings 中将 loginUrl 设置为 default.aspx,SimpleMembership 似乎也无法识别这一点,并且它希望也只有经过身份验证的用户才能访问 default.aspx。你知道如何避免这种情况吗?
    • 抱歉,default.aspx 确实会加载,但是当调用其中的 WebMethod 以验证用户身份时,作为我正在执行的 jquery ajax 调用的一部分,我收到 401 错误(未授权)。你知道我必须如何通过 jquery 拨打电话才能避免出现该错误吗?
    • 为此使用&lt;location&gt; 元素。用一个例子编辑了我的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    相关资源
    最近更新 更多