ASP.NET 网站的自定义登录机制

2024-03-06

我正在开发一个 ASP.NET 网站,我需要摆脱一些自定义但简单的登录机制。我从著名的员工信息入门套件 http://eisk.codeplex.com/

这是我到目前为止所拥有的:

在 ASP.NET 页面上:

protected void ButtonLogOn_Click(object sender, EventArgs e)
{
    if (String.IsNullOrEmpty(txtUserName.Value) || String.IsNullOrEmpty(txtPassword.Value))
        labelMessage.Text = MessageFormatter.GetFormattedErrorMessage("You can login using a username and a password associated with your account. Make sure that it is typed correctly.");
    else
    {
        //if the log-in is successful
        LoginPage LoginBack = new LoginPage();

        if (LoginBack.VerifyCredentials(txtUserName.Value, txtPassword.Value) == 0)
        {
            SiteLogin.PerformAuthentication(txtUserName.Value, checkBoxRemember.Checked);
        }
        else
        {
            labelMessage.Text = MessageFormatter.GetFormattedErrorMessage("<strong>Login Failed!</strong><hr/>The username and/or password you entered do not belong to any User account on our system.<br/>You can login using a username and a password associated with your account. Make sure that it is typed correctly.");
        }
    }
}

protected void ButtonAdminLogOn_Click(object sender, EventArgs e)
{
    if (String.IsNullOrEmpty(txtUserName.Value) || String.IsNullOrEmpty(txtPassword.Value))
        labelMessage.Text = MessageFormatter.GetFormattedErrorMessage("<strong>Login Please!</strong><hr/>You can login using a username and a password associated with your account. Make sure that it is typed correctly.");
    else
    {
        //if the log-in is successful
        if (txtUserName.Value == "admin" && txtPassword.Value == "123123")
        {
            SiteLogin.PerformAdminAuthentication("admin", checkBoxRemember.Checked);
        }
        else
        {
            labelMessage.Text = MessageFormatter.GetFormattedErrorMessage("<strong>Login Failed!</strong><hr/>The username and/or password you entered do not belong to any Administrator ccount on our system.<br/>You can login using a username and a password associated with your account. Make sure that it is typed correctly.");
        }
    }
}

和一个实用程序类

public static void PerformAuthentication(string userName, bool remember)
{
    FormsAuthentication.RedirectFromLoginPage(userName, remember);

    if (HttpContext.Current.Request.QueryString["ReturnUrl"] == null)
    {
        RedirectToDefaultPage();
    }
    else
    {
        HttpContext.Current.Response.Redirect(HttpContext.Current.Request.QueryString["ReturnUrl"]);
    }
}

public static void PerformAdminAuthentication(string userName, bool remember)
{
    FormsAuthentication.RedirectFromLoginPage(userName, remember);

    if (HttpContext.Current.Request.QueryString["ReturnUrl"] == null)
    {
        RedirectToAdminDefaultPage();
    }
    else
    {
        HttpContext.Current.Response.Redirect(HttpContext.Current.Request.QueryString["ReturnUrl"]);
    }
}

我的登录表单有两个按钮: 管理员登录是硬编码的名称/密码。正常的登录例程返回到另一个程序集,该程序集调用 Web 服务并根据域登录检查用户名和密码。

现在,还有另一个包含代码的文件让我感到困惑。

全局.asax

<script RunAt="server">
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
    if (HttpContext.Current.User != null)
    {
        if (HttpContext.Current.User.Identity.IsAuthenticated)
        {
            if (HttpContext.Current.User.Identity.AuthenticationType != "Forms")
            {
                throw new InvalidOperationException("Only forms authentication is supported, not " +
                        HttpContext.Current.User.Identity.AuthenticationType);
            }

            IIdentity userId = HttpContext.Current.User.Identity;

            //if role info is already NOT loaded into cache, put the role info in cache
            if (HttpContext.Current.Cache[userId.Name] == null)
            {
                string[] roles;

                if (userId.Name == "admin")
                {
                    roles = new string[1] { "administrators" };
                }
                else if (userId.Name == "member1")
                {
                    roles = new string[1] { "employees" };
                }
                else
                {
                    roles = new string[1] { "public" };
                }

                //1 hour sliding expiring time. Adding the roles in cache. 
                //This will be used in Application_AuthenticateRequest event located in Global.ascx.cs 
                //file to attach user Principal object.
                HttpContext.Current.Cache.Add(userId.Name, roles, null, DateTime.MaxValue, TimeSpan.FromHours(1), CacheItemPriority.BelowNormal, null);
            }

            //now assign the user role in the current security context
            HttpContext.Current.User = new GenericPrincipal(userId, (string[])HttpContext.Current.Cache[userId.Name]);
        }
    }

}
</script>

该网站有一些允许免费访问的“关于”页面,但其余页面可供管理员或员工使用。我的管理员用户名/密码是固定的,但员工登录名以域格式输入,需要在目标域上进行验证(全部完成),然后设置员工角色。

我该如何在 Global.asax 文件的 Application_AuthenticateRequest 方法中执行此操作?


为不同的文件夹设置不同的身份验证模式(通过网页配置 http://msdn.microsoft.com/en-us/library/ms178683.aspx甚至只是IIS 管理单元 http://technet.microsoft.com/en-us/library/cc733010%28WS.10%29.aspx):

  • 根匿名(关于页面)
  • ~/Admin 区域的表单身份验证
  • Windows/NTLM 用于 ~/Employers 区域

您也可以使用扩展登录控制 http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.login.aspx与定制会员提供者 http://msdn.microsoft.com/en-us/library/system.web.security.membership.aspx.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.NET 网站的自定义登录机制 的相关文章

  • 在 LINQ 中按 Id 连接多表和分组

    我想按categoryId显示列表产品的名称组 这是我的代码 我想要我的视图显示结果 Desktop PC HP Red PC Dell Yellow PC Asus Red SmartPhone Lumia 720 Blue 我的组模型
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 将 Word 文档另存为图像

    我正在使用下面的代码将 Word 文档转换为图像文件 但是图片显得太大 内容不适合 有没有办法渲染图片或将图片保存到合适的尺寸 private void btnConvert Click object sender EventArgs e
  • 在 C 中初始化变量

    我知道有时如果你不初始化int 如果打印整数 您将得到一个随机数 但将所有内容初始化为零似乎有点愚蠢 我问这个问题是因为我正在评论我的 C 项目 而且我对缩进非常直接 并且它可以完全编译 90 90 谢谢 Stackoverflow 但我想
  • 在 Visual Studio 2010 中从 Fortran 调用 C++ 函数

    我想从 Fortran 调用 C 函数 为此 我在 Visual Studio 2010 中创建了一个 FORTRAN 项目 之后 我将一个 Cpp 项目添加到该 FORTRAN 项目中 当我要构建程序时出现以下错误 Error 1 unr
  • 为什么调用非 const 成员函数而不是 const 成员函数?

    为了我的目的 我尝试包装一些类似于 Qt 共享数据指针的东西 经过测试 我发现当应该调用 const 函数时 会选择它的非 const 版本 我正在使用 C 0x 选项进行编译 这是一个最小的代码 struct Data int x con
  • 是否有实用的理由使用“if (0 == p)”而不是“if (!p)”?

    我倾向于使用逻辑非运算符来编写 if 语句 if p some code 我周围的一些人倾向于使用显式比较 因此代码如下所示 if FOO p some code 其中 FOO 是其中之一false FALSE 0 0 0 NULL etc
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • Coldfusion 跨站点身份验证

    好的 在我正在开发的 Coldfusion 网站上 我刚刚安装了一个名为 Galleon 的第三方 开源 CF 论坛 我不久前问过类似的问题 但现在我们已经取得了一些进展 目前的问题是 它不会识别父站点本身存在的任何变量 会话等 论坛本身存
  • 标准化 UTF-8 到底是什么?

    The 重症监护室项目 http userguide icu project org transforms normalization 现在也有一个PHP库 http us php net manual en class normalize
  • 如何禁用 fread() 中的缓冲?

    我正在使用 fread 和 fwrite 读取和写入套接字 我相信这些函数用于缓冲输入和输出 有什么方法可以在仍然使用这些功能的同时禁用缓冲吗 Edit 我正在构建一个远程桌面应用程序 远程客户端似乎 落后于服务器 我不知道可能是什么原因
  • CMake 无法确定目标的链接器语言

    首先 我查看了this https stackoverflow com questions 11801186 cmake unable to determine linker language with c发帖并找不到解决我的问题的方法 我
  • AES 128 CBC 蒙特卡罗测试

    我正在 AES 128 CBC 上执行 MCT 如中所述http csrc nist gov groups STM cavp documents aes AESAVS pdf http csrc nist gov groups STM ca
  • 使用管道时,如果子进程数量大于处理器数量,进程是否会被阻塞?

    当子进程数量很大时 我的程序停止运行 我不知道问题是什么 但我猜子进程在运行时以某种方式被阻止 下面是该程序的主要工作流程 void function int process num int i initial variables for
  • 使用 C# 读取 Soap 消息

  • 按 Esc 按键关闭 Ajax Modal 弹出窗口

    我已经使用 Ajax 显示了一个面板弹出窗口 我要做的是当用户按 Esc 键时关闭该窗口 这可能吗 如果有人知道这一点或以前做过这一点 请帮助我 Thanks 通过以下链接 您可以通过按退出按钮轻松关闭窗口 http www codepro
  • 方法优化 - C#

    我开发了一种方法 允许我通过参数传入表 字符串 列数组 字符串 和值数组 对象 然后使用这些参数创建参数化查询 虽然它工作得很好 但代码的长度以及多个 for 循环散发出一种代码味道 特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的
  • System.IO.FileNotFoundException:找不到网络路径。在 Windows 7 上使用 DirectoryEntry 对象时出现异常

    我正在尝试使用 DirectoryEntry 对象连接到远程 Windows 7 计算机 这是我的代码 DirectoryEntry obDirEntry new DirectoryEntry WinNT hostName hostName
  • 我的班级应该订阅自己的公共活动吗?

    我正在使用 C 3 0 遵循标准事件模式我有 public event EventHandler

随机推荐

  • 如何保护 Java/Javafx 代码不被最终用户看到?

    我一个人在一家公司做一个项目已经两年多了 该项目是一个非常大的项目 使用 rxtx 与硬件设备进行通信 我使用 Java 8 和 JAVAFX 作为 UI 现在它几乎完成了 我开始搜索如何交付公司将分发给其客户的最终用户应用程序 问题是 我
  • ValueError:字段 admin.LogEntry.user 是使用惰性引用声明的

    我正在开发一个新的 django 项目并坚持迁移 我想创建一个 UserModel 为了做到这一点 到目前为止我做了两件事 1 我制作了AuthUser模型并在下面的类中设置了一个Meta类 In 模型 py class AuthUser
  • safari - jquery - ajax 500 内部服务器错误

    我创建了一个 jquery ajax 调用 它在 Chrome firefox 和 IE 中运行良好 与 Safari 一样 它在响应中给出 500 内部服务器错误 我认为这可能是由于服务器异常所致 但是当我尝试调试时 我发现它根本没有到达
  • SSDT 架构比较锁 SET QUOTED_IDENTIFIER 为 OFF

    我安装了 Visual studio 2012 并安装了 SSDT 版本 11 1 20627 0 一直困扰我的问题之一是 SSDT 项目中的所有存储过程 当尝试使用模式比较将其推送到服务器时 SP 的 SET QUOTED IDENTIF
  • 使用动态规划求解背包

    我正在使用我在此链接中找到的算法来实现背包问题的片段背包问题 http www es ele tue nl education 5MC10 Solutions knapsack pdf I have also attached the sn
  • 无法运行地图示例

    我正在尝试运行谷歌地图例如 但它一直在控制台中给我 WARNING Application does not specify an API level requirement Device API version is 7 Android
  • “单一分配”对于 boost::make_shared 意味着什么

    在boost文档中make shared http www boost org doc libs 1 47 0 libs smart ptr make shared html 它说 除了方便和风格之外 这样的功能还具有异常安全性和显着性 更
  • Spring 类级别验证和 Thymeleaf

    我正在学习 Spring 框架和 Thymeleaf 我已经知道如何使用类似的东西来显示字段错误 fields errors xx 但是 我对如何在 Thymeleaf 中显示对象错误消息感到困惑 这是我的UserForm class Pa
  • Cocoa 与 MacOS X 钥匙串的接口

    我有一些 Mac 代码需要存储 访问和更新密码 以便将用户与 Web API 连接起来 放置这些信息的正确位置应该是 Mac Keychain 但似乎没有 cocoa 界面 请参阅这个答案 https stackoverflow com a
  • 在 Devise on Rails 中使用单独的身份验证模型

    我有一个简单的解决方案 我用以下对象自己制作 Account 具有 token 字段 在身份验证时返回并在 API 调用中使用 验证 具有 auth type auth id 和对帐户的引用 我有一个单独的验证模型能够连接多种登录方式 设备
  • Android SimpleDateFormat格式问题

    我正在尝试将日期格式化为所需的格式 但我收到的日期错误 这就是我正在做的事情 我收到的日期如下 3 24 2012 8 25 03 AM 3 23 2012 2 57 01 PM 3 15 2012 9 28 01 AM 并想将它们展示为
  • 为什么 KeyPairGenerator.genKeyPair() 这么慢

    我有一些 Java 代码 当我运行函数时KeyPairGenerator genKayPair 工作时间为 40 秒或更长时间 如何改变这种现状呢 如果我跑 openssl req x509 nodes days 365 newkey rs
  • 如何选择.NET版本来编译项目?

    我有VS2005 如何在特定版本的 NET 下编译我的项目 我已经安装了 1 0 2 0 3 0 和 3 5 提前Tnx 恐怕你不能 VS2005仅适用于 NET框架2 0 您需要适当版本的 Visual Studio 才能与其他版本一起使
  • Angular 4文档离线计算机[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想找到 Angular 4 文档的本地 离线版本 https angular io docs htt
  • 如何在 RxJava 中计算移动平均线

    在金融领域 我们通常需要从时间序列数据流中计算移动窗口总值 以移动平均线为例 假设我们有以下数据流 T是时间戳 V是实际值 T0 V0 T1 V1 T2 V2 T3 V3 T4 V4 T5 V5 T6 V6 T7 V7 T8 V8 T9 V
  • 如何将字符串转换为 NSDate?

    我有每当有新的远程通知时收到的字符串 我正在为我的后端使用解析 我检索到的字符串来自 createdAt 列 我试过下面的代码 var ca 2015 07 03T03 16 17 220Z var dateFormater NSDateF
  • 使用带淘汰赛的引导按钮下拉菜单

    我正在尝试使用 Bootstrap 的精美样式按钮下拉菜单 http getbootstrap com components btn dropdowns淘汰赛 不幸的是 下拉菜单是使用链接而不是
  • LISP - 小数点后的数字

    有谁知道如何在 Lisp 中指定浮点数小数点后的位数 假设我在 REPL 上打印此命令 CL USER 3 gt format t 15f float 1 7 I get 0 142857150000000 但是该数字四舍五入到小数点后第
  • 使用 7zip 检测文件是否为存档

    我想使用 SevenZipSharp 来确定文件是否是存档 我知道这是可能的 因为在资源管理器中 如果我将 zip 重命名为 bmp 7zip 仍然会将其识别为存档 edit 换句话说 我希望 7zip 告诉我文件 无论扩展名如何 是否包含
  • ASP.NET 网站的自定义登录机制

    我正在开发一个 ASP NET 网站 我需要摆脱一些自定义但简单的登录机制 我从著名的员工信息入门套件 http eisk codeplex com 这是我到目前为止所拥有的 在 ASP NET 页面上 protected void But