我有一个Angular应用程序,我尝试使用基本身份验证对我的REST服务进行身份验证。我添加了相应的" Base {用户名:密码}"用base64编码,我打电话给我的休息api,但继续回到401.我明显错过了一步...
这里是角度代码:
angular
.module('myApp.services')
.factory('AuthenticationService', ['$http', '$q', '$location', 'Base64', 'SessionService', function ($http, $q, $location, encoder, session) {
return {
authenticate:
function (user, password) {
var deferred = $q.defer();
var url = "http://localhost:28924/api/login";
if (user && password) {
var encoded = encoder.encode(user + ':' + password);
$http.defaults.headers.common.Authorization = 'Basic ' + encoded;
console.log('here');
sessionStorage.setItem('Authorization', $http.defaults.headers.common.Authorization);
$http.get(url)
.success(function (data, status, headers, config) {
console.log('login Successful in Authentication service');
deferred.resolve(data);
session.setSession();
})
.error(function (data, status, headers, config) {
deferred.reject(status);
});
}
else {
deferred.reject(401);
}
return deferred.promise;
},
logout:
function () {
$http.defaults.headers.common.Authorization = null;
$http.defaults.headers.common.Impersonate = null;
$location.url('/login');
}
};
}
]
);
这是我的LoginController:
public class LoginController : ApiController
{
public LoginController()
{
}
[Authorize]
public HttpResponseMessage Get()
{
//return this.ControllerContext.Request.CreateResponse(HttpStatusCode.OK);
if (this.User.Identity.IsAuthenticated)
{
return this.ControllerContext.Request.CreateResponse(HttpStatusCode.OK);
}
return this.ControllerContext.Request.CreateResponse(HttpStatusCode.Unauthorized);
}
}
我还将我的IISExpress配置文件设置为"允许"基本身份验证,如下所述:set basic authentication in IIS Express。
只需添加"授权"属性到我的Get方法让主机知道检查授权头中传递的凭据?或者我是否需要实施额外的内容,例如此SO帖子(问题部分):basic authentication with custom message handler?
在我看来,在我的&#34; Get&#34;中需要更多。方法,但我找不到任何好的例子来帮助我完成这个....(如果你还没弄明白,这是我第一次尝试使用基本身份验证和REST api / services。< / p>
编辑:啊哈!我越走越近了。 @ Chandermani的回复由于某种原因促使我查看我的OWN web.config并且我意识到我没有这个:
<security>
<authentication>
<basicAuthentication enabled="true"/>
</authentication>
</security>
在导航到... / api /登录页面时,添加此项现在会提示我输入凭据。
Edit2 :通过Chrome开发工具检查通过网络发送的内容,显示正在发送授权标头,同时指定基本身份验证和base64编码的用户名和密码。这是它的样子:
Request URL:http://localhost:28924/api/login
Request Method:GET
Status Code:401 Unauthorized
Request Headersview source
Accept:application/json, text/plain, */*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Authorization:Basic YWblahblahblahDE=
Connection:keep-alive
Host:localhost:28924
Referer:http://localhost:28924/index.html
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36
Response Headersview source
Cache-Control:private
Content-Length:6333
Content-Type:text/html; charset=utf-8
Date:Wed, 08 Jan 2014 14:32:14 GMT
Server:Microsoft-IIS/8.0
WWW-Authenticate:Negotiate
WWW-Authenticate:NTLM
WWW-Authenticate:Basic realm="localhost"
X-Powered-By:ASP.NET
X-SourceFiles:=?UTF-8?B?QzpcU291cmNlQ29kZVxUcmlhbHNNb2JpbGVcVHJhaWxzTW9iaWxlLldlYlxhcGlcbG9naW4=?=
当api / login页面提示我输入凭据时,它会陷入无限循环。我输入它们,按回车键,然后再次询问它们。
编辑3:好的,我能够进行身份验证!我必须在用户名前面指定域名,因为我正在运行localhost ...
感谢大家指点我正确的方向!
答案 0 :(得分:2)
一系列变化导致解决我的问题:
1)我需要在我的OWN web.config中允许基本身份验证。我之前只在IISExpress applicationhost.config中设置了它(参见编辑(1))
2)显示Chrome开发工具的输出证明基本身份验证授权标头实际上是通过它发送的。
3)最后一个问题是因为我在localhost上运行,我需要在用户名中指定要进行身份验证的域。这可能是一个更简洁的方法,但我刚刚在我的用户名字段中输入了这个:mydomain \ ganders,它开始工作了。