问题标签 [authentication]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
基于表单的网站身份验证权威指南
版主备注:
这个问题不适合我们的问答格式以及当前适用于 Stack Overflow的话题性规则。对于内容仍然有价值的此类问题,我们通常使用“历史锁定”。但是,此问题的答案得到积极维护,历史锁定不允许编辑答案。因此,已应用“wiki 答案”锁定以允许编辑答案。您应该假设存在通常由历史锁定处理的话题性问题(即这个问题不是 Stack Overflow 的话题性问题的一个很好的例子)。
网站基于表单的身份验证
我们认为 Stack Overflow 不应该只是针对非常具体的技术问题的资源,还应该提供有关如何解决常见问题变体的一般指南。“基于表单的网站身份验证”应该是此类实验的一个很好的主题。
它应包括以下主题:
- 如何登录
- 如何退出
- 如何保持登录状态
- 管理 cookie(包括推荐设置)
- SSL/HTTPS 加密
- 如何存储密码
- 使用秘密问题
- 忘记用户名/密码功能
- 使用nonce防止跨站点请求伪造 (CSRF)
- 开放ID
- “记住我”复选框
- 浏览器自动完成用户名和密码
- 秘密 URL(受摘要保护的公共URL )
- 检查密码强度
- 电子邮件验证
- 以及更多关于 基于表单的身份验证...
它不应包括以下内容:
- 角色和授权
- HTTP 基本认证
请通过以下方式帮助我们:
- 建议子主题
- 提交关于这个主题的好文章
- 编辑官方答案
IIS 6/ASP.NET Windows 身份验证清单?
我一直无法让我的 ASP.NET 应用程序自动将用户登录到我正在构建的 Intranet 站点。无论是谷歌搜索还是我应用的实验,IE7 总是显示一个登录框。
我在 Web.config 中设置了 Windows 身份验证模式,禁用匿名访问并在 IIS 中配置了正确的默认域,但它仍然要求用户登录,更烦人的是,用户也需要提供域(DOMAIN\auser ),这会导致非技术访问者出现问题。感谢 Zeus 的密码记忆功能。
我不是网络管理员,因此有关 Active Directory 的某些内容可能设置不正确,或者可能只是我遗漏了一些非常简单的内容。请注意,我不想模拟用户,我只需要知道 IPrincipal.Name 属性与我的用户数据库中的有效记录相匹配,从而验证用户对我的应用程序的身份。
为此,拥有一份以这种方式协同工作的 AD、ASP.NET 和 IIS 的所有配置要求的清单将非常有用,作为调试的参考,并有望减少一些用户摩擦。
如何使用纯 HTTP 身份验证和 PHP 在 Apache 下获取经过身份验证的用户名?
首先,让我们把安全考虑排除在外。我在 Apache 下使用简单的身份验证,用于一次性、仅供内部使用、非 Internet 连接的 LAN、PHP Web 应用程序。
如何在 PHP 中获取经过 HTTP 身份验证的用户名?
如何将 SSL 添加到使用 httplistener 的 .net 应用程序 - 它*不会*在 IIS 上运行
最近的粗体编辑
我正在使用 .netHttpListener
类,但我不会在 IIS 上运行此应用程序,也不会使用 ASP.net。这个网站描述了实际使用什么代码来实现与 asp.net 的 SSL,并且这个网站描述了如何设置证书(虽然我不确定它是否只适用于 IIS)。
类文档描述了各种类型的身份验证(基本、摘要、Windows 等)——它们都没有提到 SSL。它确实说如果使用 HTTPS,则需要设置服务器证书。这将是一个单行属性设置并HttpListener
计算其余部分吗?
简而言之,我需要知道如何设置证书以及如何修改代码以实现 SSL。
虽然在我尝试访问 HTTPS 时没有发生这种情况,但我确实注意到我的系统事件日志中有一个错误 - 源是“Schannel”,消息的内容是:
尝试访问 SSL 服务器凭证私钥时发生致命错误。从加密模块返回的错误代码是 0x80090016。
编辑:
到目前为止采取的步骤
- 在 C# 中创建了一个适用于 HTTP 连接的有效 HTTPListener(例如“ http://localhost:8089/foldername/ ”
- 使用 makecert.exe 创建证书
- 使用 certmgr.exe 添加了要信任的证书
- 使用 Httpcfg.exe 监听测试端口(例如 8090)上的 SSL 连接
- 通过 listener.Prefixes.Add( https://localhost:8090/foldername/ ")将端口 8080 添加到 HTTPListener ;
- 在浏览器中测试 HTTP 客户端连接,例如 ( http://localhost:8089/foldername/ ") 并收到正确的返回
- 在浏览器中测试了一个 HTTPS 客户端连接,例如(http://localhost:8090/foldername/)并收到“数据传输中断”(在 Firefox 中)
- Visual Studio 中的调试表明,当 HTTPS 连接启动时,接收请求的侦听器回调永远不会被命中 - 我看不到任何可以设置断点以更早捕获其他内容的地方。
- netstat 显示监听端口对 HTTPS 和 HTTP 都是开放的。尝试连接后,HTTPS 端口确实会进入 TIME_WAIT。
- Fiddler和HTTPAnalyzer没有捕捉到任何流量,我猜它在这个过程中还远远不够显示在那些 HTTP 分析工具中
问题
- 问题可能是什么?
- 是否有一段.Net 代码我丢失了(这意味着我必须在 C# 中做更多事情,而不是简单地向指向 HTTPS 的侦听器添加一个前缀,这就是我所做的)
- 在某处错过了配置步骤?
- 我还能做些什么来分析问题?
- 系统事件日志中的错误消息是否表明存在问题?如果是这样,它将如何修复?
我应该使用用户名还是用户 ID 来引用 ASP.NET 中经过身份验证的用户
所以在我的简单学习网站中,我使用了内置的 ASP.NET 身份验证系统。
我现在添加一个用户表来保存他的 zip、DOB 等内容。我的问题是:
- 在新表中,键应该是用户名(字符串)还是用户 ID,即他们在
asp_ tables
. - 如果最佳做法是使用那个丑陋的指南,有谁知道如何获得它?
System.Web.HttpContext.Current.User.Identity.Name
它似乎不像名称( )那样容易访问 - 如果您建议我既不使用(不是由 ASP.NET 身份验证提供的 guid 和 userName 字段),那么我该如何使用 ASP.NET 身份验证呢?我喜欢的一种选择是使用用户的电子邮件地址作为登录名,但是如何让 ASP.NET 身份验证系统使用电子邮件地址而不是用户名?(或者那里无事可做,只是我决定我“知道” userName 实际上是一个电子邮件地址?
请注意:
- 我不是在问如何在 .NET 中获取 GUID,我只是指
asp_ tables
作为 guid 中的 userID 列。 - 用户名在 ASP.NET 身份验证中是唯一的。
登录ID用什么?
我们正处于对我们的产品进行重大改写的早期设计阶段。目前,我们的客户主要是企业。我们管理帐户。每个帐户的用户名都在自己的命名空间中,但这意味着我们不能在服务器之间移动资产。
我们想移动到单个命名空间。但这带来了唯一用户名的问题。
那么最好的主意是什么?
- 电子邮件地址(带验证)?
- 唯一的字母数字字符串(“johnsmith9234”)?
- 我们应该看看 OpenID 吗?
OpenID 属性交换 - 我应该使用它吗?
我的网站将仅使用 OpenID 进行身份验证。我想通过属性交换来拉取用户详细信息,但是属性交换似乎给 StackOverflow 带来了很多痛苦。
行业现状如何?是否有任何 OpenID 提供商在属性交换方面做得不错?
我应该完全避开 OpenID 属性交换吗?
如何处理对功能的不一致支持?
Ruby on Rails 中的 OpenID 身份验证
我是 Ruby on Rails 的新手,但我创建了几个小应用程序。无论如何,我对 OpenID 真的很感兴趣,我想在 Rails 应用程序中实现 OpenID 身份验证以及一些 Sreg 的东西。我所做的所有研究都提出了已过时或对我不起作用的文章。由于我对 Rails 很陌生,我很难调试问题,所以......
在 Rails 中实现 OpenId 的最佳方法是什么?
仅接受来自经过身份验证的用户的某些 ajax 请求
确保仅从经过身份验证的用户接受对某些页面的某些 ajax 调用的最佳实践是什么?
例如:
假设我有一个名为blog.php的主页(我知道,创造力比比皆是)。我们还假设有一个名为delete.php的页面,它查找参数post_id,然后从数据库中删除一些条目。
在这个非常人为的示例中,blog.php 上有一些机制,它通过 ajax 向 delete.php 发送请求以删除条目。
现在这个机制只对 blog.php 上经过身份验证的用户可用。但是有什么办法可以阻止某人用一堆随机数调用 delete.php 并删除站点中的所有内容呢?
我做了一个快速测试,在 blog.php 中设置了一个会话变量,然后对 delete.php 进行了 ajax 调用,以返回是否设置了会话变量(它不是)。
处理这类事情的公认方法是什么?
好的。我第一次尝试这个时一定是疯了。
我刚刚做了另一个测试,就像我上面描述的那样,它工作得很好。
通过 WCF 进行身份验证的最佳方式是什么?
通过 WCF 实现身份验证的最佳方法是什么?
我宁愿不使用 WS-*,因为它需要独立于传输。
我应该“自己动手”吗?是否有任何指导(文章/博客文章)?
或者有什么方法可以(而且我应该)在服务器端使用内置的 ASP.NET 成员资格和配置文件提供程序?