Web应用程序的上下文有什么不同?我看到很多缩写"auth".它是代表身份验证还是身份验证?还是两者兼而有之?
如果用户使用基本身份验证,是否可以从网站注销用户?
杀戮会话是不够的,因为一旦用户通过身份验证,每个请求都包含登录信息,因此用户下次使用相同的凭据访问站点时会自动登录.
到目前为止,唯一的解决方案是关闭浏览器,但从可用性的角度来看,这是不可接受的.
存储HTTP基本身份验证凭据直到浏览器关闭,但有没有办法在浏览器关闭之前删除凭据?
我读了一个关于HTTP 401状态代码的技巧,但似乎工作不正常(请参阅评论回答).也许trac使用的机制就是解决方案.
可以使用JavaScript删除凭据吗?或者结合使用JavaScript和状态401技巧?
可能重复:
通过PHP进行HTTP身份验证注销
你好
我在我的网站上使用.htaccess和保护了一些功能.htpasswd.当用户尝试访问它时,他们会立即输入详细信息.他们输入他们的细节并进入,可以看到东西等.一切正常.
我的问题是如何logout为这种类型的身份验证创建功能.我知道他们可以关闭浏览器窗口以"注销".但这并不理想.你有什么建议给我的?
谢谢.
我花了一些时间来评估可用于在Java EE应用程序中重新验证用户身份的选项.
因此,请建议以下列出的选项是否有效以及有关优缺点的陈述.可能是我遗漏了可能使身份验证方法可行的细节.或者可能是我错过了另一个选项(我们再次严格地讨论java EE,因此没有查询身份验证,除非可以以符合EE的方式完成,否则不会这样做)
1. DIGEST/BASIC认证
<security-constraint>
<web-resource-collection>
<web-resource-name>admin</web-resource-name>
<url-pattern>/protected/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>DIGEST/BASIC</auth-method>
<realm-name>as-defined-secuity-realm</realm-name>
</login-config>
Run Code Online (Sandbox Code Playgroud)
好处
这是一种REST友好的身份验证方式.您可以通过AJAX调用发送授权凭据.一旦用户通过身份验证,浏览器将伴随任何具有正确Authorization: Basic/Digest QWxhZGRpbjpvcGVuIHNlc2FtZQ==标头的请求.如果凭据不良,将向用户显示丑陋的浏览器登录屏幕 - 如果您可以使用它,那么BASIC/DIGEST auth就是您的选择.
在Digest的情况下,传递给服务器的字符串是MD5加密的字符串,它比Basic更安全(它是'user:password'字符串的Base64编码),但仍然可以解密.因此,在安全性方面,BASIC与FORM身份验证一样安全,而DIGEST是最安全的.总之,如果您的站点完全是HTTPS(我的意思是完全是因为如果某些资源是通过HTTP获取的,例如您的授权标题将对第三方可见)您可以安全地使用BASIC/DIGEST.
缺点
2.基于FORM的身份验证
<security-constraint>
<web-resource-collection>
<web-resource-name>admin</web-resource-name>
<url-pattern>/protected/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>FORM</auth-method>
<realm-name>as-defined-security-realm</realm-name>
<form-login-config>
<form-login-page>/auth/login.html</form-login-page>
<form-error-page>/auth/error.html</form-error-page>
</form-login-config>
</login-config>
Run Code Online (Sandbox Code Playgroud)
简而言之,如果用户访问protected/*URL,则登录页面将包含在响应中.因此,用户期望他将获得在form-login-page标签中配置的登录页面而不是内容.如果密码正常,他将被转发(302 Paged Moved …
我有一个Firefox和IE的解决方案,但我没有找到任何谷歌Chrome的解决方案.
有没有办法在谷歌浏览器中做到这一点?
每当我去/admin/logout,我都被正确地重定向到我的项目的根目录,但是当我访问时仍然登录,/admin/因为我没有被提示输入凭据.
这是我的配置:
security.yml
security:
firewalls:
admin_area:
pattern: ^/admin
http_basic: ~
stateless: true
switch_user: { role: ROLE_SUPER_ADMIN, parameter: _want_to_be_this_user }
logout: { path: /admin/logout, target: / }
Run Code Online (Sandbox Code Playgroud)
AdminBundle /资源/配置/ routing.yml中
logout:
pattern: /logout
Run Code Online (Sandbox Code Playgroud)
应用程序/配置/ routing.yml中
admin:
resource: "@AdminBundle/Resources/config/routing.yml"
prefix: /admin
Run Code Online (Sandbox Code Playgroud)
由于标头状态,授权仍然存在,Authorization:Basic YWRtaW46cEAkJHcwUmQh因此我想在请求期间仍然会向应用程序提供凭据.
我知道有从注销没有适当的方式HTTP Basic Auth按这个问题,但也许Symfony2的允许了吗?
有没有办法注销在php中完成的摘要认证.
我试过unset($ _ SERVER ["PHP_AUTH_DIGEST"]); 但它不会要求重新登录.我知道如果我关闭浏览器然后它将工作,这是我的功能.
function login(){
$realm = "Restricted area";
$users = array("jamesm"=>"");
if (empty($_SERVER["PHP_AUTH_DIGEST"])) {
header("HTTP/1.1 401 Unauthorized");
header("WWW-Authenticate: Digest realm=\"{$realm}\",qop=\"auth\",nonce=\"".uniqid()."\",opaque=\"".md5($realm)."\"");
return false;
}
if (!($data = http_digest_parse($_SERVER["PHP_AUTH_DIGEST"])) || !isset($users[$data["username"]]))
return false;
$A1 = md5($data["username"] . ":{$realm}:{$users[$data["username"]]}");
$A2 = md5($_SERVER["REQUEST_METHOD"].":{$data["uri"]}");
$valid_response = md5("{$A1}:{$data["nonce"]}:{$data["nc"]}:{$data["cnonce"]}:{$data["qop"]}:{$A2}");
if ($data["response"] != $valid_response)
return false;
return true;
}
function logout(){
unset($_SERVER["PHP_AUTH_DIGEST"]);
return true;
}
Run Code Online (Sandbox Code Playgroud)
我还需要添加到注销功能以完成此操作.
如果我改变了它的作用,但我不希望它被改变.
php security logout digest-authentication http-status-code-401
给定一个简单的登录系统(注册和登录),这两个选择中的哪一个更安全:
用户信息完全由用户名密码组成.
当然,两种选择都假设最佳情况:考虑MySQL注入,密码为md5/sha1/md5 + sha1 /任何其他加密方式等.
如果你想知道,在第一种情况下,php会将用户凭据添加到htpasswd文件中.(有关示例实现,请参阅此问题.)
好的,所以我没有使用任何会话变量,而是我的代码如下所示:
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="Enter your Twitter username and password:"');
header('HTTP/1.0 401 Unauthorized');
echo 'Please enter your Twitter username and password to view your followers.';
exit();
}
$username = $_SERVER['PHP_AUTH_USER'];
$password = $_SERVER['PHP_AUTH_PW'];
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是,当用户想要退出他们的(在这种情况下)twitter登录凭证时,我怎么能破坏这个登录会话?
是否有解决方案可以注销用户(让浏览器清除其缓存的凭据并要求用户再次登录凭据)以进行基本的 HTTP 身份验证?
我已经浏览了以下问题: