我们的网络应用程序具有用户/密码身份验证。它在 Web 服务器上运行,该服务器本身通过 HTTP 基本身份验证进行保护。这只是一个临时解决方案/解决方法。Web 应用程序的身份验证将来就足够了,但目前 Web 服务器基本身份验证根本阻止访问 Web 应用程序。
如果未在应用程序级别进行身份验证,Web 应用程序将返回状态代码 401。标WWW-Authenticate头定义了不同的领域,因此浏览器不会在 Web 服务器和 Web 应用程序身份验证之间混淆:如果我们没有定义不同的领域,则一旦应用程序的 401 到达,浏览器就会丢弃 Web 服务器凭据。
到目前为止,一切都很好。然而,我们的应用程序有自己的身份验证对话框。对于 XHR 请求,我们希望自己处理 401 状态,并且需要阻止浏览器的内部基本身份验证窗口。有一个简单的技巧:只需调整身份验证标头 ( WWW-Authenticate) 即可使用自定义身份验证方法:
WWW-Authenticate: CustomBasic realm="myapp"
Run Code Online (Sandbox Code Playgroud)
Web 服务器返回:
WWW-Authenticate: Basic realm="webserver"
Run Code Online (Sandbox Code Playgroud)
这适用于 Firefox,但不适用于 Chrome。Chrome 在使用时会忽略领域CustomBasic,并丢弃领域“webserver”的凭据(用户/密码),就好像我们根本没有定义领域“myapp”一样。
你知道为什么吗?您是否知道满足以下要求的解决方案:
是的,我知道我们可以通过在应用程序级别使用不同的 HTTP 状态代码并分别处理它们来简单地解决此问题。但如果可能的话,我想保留正确的状态代码 401。这也可能是一个有效的用例,例如,如果您有两个可通过同一主机上的两个不同 URL 路径访问的 Web 应用程序。
authentication webserver http basic-authentication http-status-code-401
有没有办法注销在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
我在IIS 7上有一个有几个子文件夹的站点.该站点使用.net 2构建,并以集成模式在池中运行.
除了名为"Reports"的文件夹下的所有aspx文件外,整个站点的工作方式都很完美.当用户试图访问该文件夹下的任何aspx页面时(即http://domain/Reports/page1.aspx),他得到401响应并且浏览器提示输入用户和密码.
远程和本地访问站点时会发生这种情况.在尝试查看IIS日志文件时,请求未被列出,就好像它被某些东西阻止一样.
我已经完成了以下测试以尝试解决此问题:
似乎IIS只是不喜欢名为"Reports"的文件夹.关于我在这里失踪的任何想法?
失败的登录尝试是否会导致HTTP 401响应?似乎并非所有主要网站都这样做.
我在asp.net web API中.在登录方法中,我检查数据库的用户/密码,如果它们不匹配,我会返回401状态代码和invalid user or password methodlike
var content = new StringContent("Invalid user name or password");
var message = new HttpResponseMessage(HttpStatusCode.Unauthorized);
message.Content = content;
throw new HttpResponseException(message);
Run Code Online (Sandbox Code Playgroud)
但API似乎忽略了我的消息,只是简单地返回一些HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
<title>401 - Unauthorized: Access is denied due to invalid credentials.</title>
<style type="text/css">
<!--
body{margin:0;font-size:.7em;font-family:Verdana, Arial, Helvetica, sans-serif;background:#EEEEEE;}
fieldset{padding:0 15px 10px 15px;}
h1{font-size:2.4em;margin:0;color:#FFF;}
h2{font-size:1.7em;margin:0;color:#CC0000;}
h3{font-size:1.2em;margin:10px 0 0 0;color:#000000;}
#header{width:96%;margin:0 0 0 0;padding:6px 2% 6px 2%;font-family:"trebuchet MS", …Run Code Online (Sandbox Code Playgroud) asp.net-mvc http-status-code-401 asp.net-mvc-4 asp.net-web-api
我无法辨别为什么我的应用程序返回401 Unauthorized.我的机构控制器中的其他操作在没有登录的情况下正常工作.但是,这个和另一个页面返回401.如果登录,这些页面工作得非常好,但它们不应该要求登录.我甚至已经这样做了至于清空视图和动作,但页面仍然返回401.当通过fiddler调试时,我只是收到302重定向.
我尝试过在其他地方进行研究,并尝试过Warden认证的解决方案,召回401 Unauthorized但没有成功.
安慰
Started GET "/institutions/3" for 127.0.0.1 at 2013-04-25 14:38:15 -0400
Processing by InstitutionsController#show as HTML
Parameters: {"id"=>"3"}
?[1m?[36mInstitution Load (0.0ms)?[0m ?[1mSELECT `institutions`.* FROM `institutions` WHERE `institutions`.`id` = 3 LIMIT 1?[0m
Load data...
Load assets...
Run Code Online (Sandbox Code Playgroud)
然后我提交表单,方法设置为GET
Started GET "/visit/schedule/preview?utf8=%E2%9C%93&selected_ids=4693" for 127.0.0.1 at 2013
-04-25 14:28:53 -0400
Processing by InstitutionsController#previewselectedvisits as HTML
Parameters: {"utf8"=>"?", "selected_ids"=>"4693"}
Completed 401 Unauthorized in 0ms
Started GET "/users/sign_in" for 127.0.0.1 at 2013-04-25 14:28:53 -0400
Processing by Devise::SessionsController#new as HTML …Run Code Online (Sandbox Code Playgroud) 我收到401未经授权的错误.我的网络服务是用mvc编写的.在IIS中配置为使用Windows身份验证.下面是小提琴手的截屏

当我从浏览器点击URL时,它会弹出窗口输入用户名和密码.如何避免弹出窗口?
我从另一个窗口服务调用这个web api.
如果身份验证失败,我想再次重定向到我的主页,因为即使您按取消并且甚至没有尝试进行身份验证,身份验证也会失败,并且会从ngnix进行基本身份验证.
如果我按照屏幕截图中显示的方式进行操作,则只需加载页面; 所以重定向工作,但身份验证和其他页面的访问不再显示.你知道我能尝试的其他事吗?

authentication configuration nginx basic-authentication http-status-code-401
经过几个小时的互联网搜索,我决定向你们寻求帮助。
我已经用几个简单的 get/post 方法编写了一个 Web API。我正在使用个人用户帐户身份验证方法。
使用 HttpClient,我成功地调用了每个 AUTHORIZED get 和 post 方法以及用于生成授权令牌的 /token 端点。
问题是我必须在 .NET Framework 3.5 项目中调用这些方法。因此,我尝试使用 WebClient 来执行此操作,因为我了解到 .NET Framework 3.5 不支持 HttpClient。
GetAPIToken() 方法生成不记名令牌并且它有效。
private static string GetAPIToken(string userName, string password, string apiBaseUri)
{
using (WebClient client = new WebClient())
{
client.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
var response = client.UploadString(apiBaseUri + "/Token", "POST", "grant_type=password&username=" + userName + "&password=" + password);
var jObject = JObject.Parse(response);
return jObject.GetValue("access_token").ToString();
}
}
Run Code Online (Sandbox Code Playgroud)
当我从 Web API 中删除 [Authorize] 属性时,此 GET 方法有效,但在获得授权后无法使其工作。
//GET ODRA?ENI …Run Code Online (Sandbox Code Playgroud) 我正在创建一个 spring boot 2.0 应用程序并尝试启用 oauth2 安全性。到目前为止,我在同一个应用程序中拥有身份验证服务器和资源服务器。我的客户端和用户详细信息以及生成的令牌保存在数据库 (mysql) 中,并且数据库架构与 spring 文档提供的相同。当我使用 Postman 在标头中提供 clientId 和 clientSecret 并在正文中提供用户凭据时,当我点击“/oauth/token/”端点时,我成功获取了访问令牌。
{
"access_token": "bef2d974-2e7d-4bf0-849d-d80e8021dc50",
"token_type": "bearer",
"refresh_token": "32ed6252-e7ee-442c-b6f9-d83b0511fcff",
"expires_in": 6345,
"scope": "read write trust"
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用此访问令牌访问我的 rest api 时,我收到 401 Unauthorized 错误:
{
"timestamp": "2018-08-13T11:17:19.813+0000",
"status": 401,
"error": "Unauthorized",
"message": "Unauthorized",
"path": "/myapp/api/unsecure"
}
Run Code Online (Sandbox Code Playgroud)
我正在使用的其余 API 如下:
http://localhost:8080/myapp/api/unsecure
http://localhost:8080/myapp/api/secure
myapp 是我的应用程序的上下文路径。
对于“安全”api,我在请求标头中提供了访问令牌,如 Spring 文档中所述:
Authorization: Bearer bef2d974-2e7d-4bf0-849d-d80e8021dc50
Run Code Online (Sandbox Code Playgroud)
而对于不安全的 api,我已经尝试过使用和不使用 Authentication 标头。在所有情况下,我都收到了两个 api 的相同错误。
此外,当我尝试打印当前经过身份验证的用户时,它会被打印为匿名用户。
我想要的是如下:
1)我希望只有在请求标头中提供访问令牌时才能访问我的安全 api。
2) 我希望未经授权的用户可以访问我的不安全 api。
3) 我应该在访问安全 url 时使用 …
java http-status-code-401 spring-boot spring-security-oauth2
iis-7 ×2
api ×1
asp.net-mvc ×1
c# ×1
devise ×1
http ×1
java ×1
logout ×1
nginx ×1
permissions ×1
php ×1
security ×1
spring-boot ×1
token ×1
unauthorized ×1
warden ×1
webclient ×1
webserver ×1