通过Angular进行基本身份validation,为什么抛出错误401

我有一个Angular应用程序,我正在尝试使用基本身份validation对我的REST服务进行身份validation。 我正在添加授权标题以及在base64中编码的相应“Base {username:password}”,我正在调用我的rest 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配置文件设置为“允许”基本身份validation,如下所述: 在IIS Express中设置基本身份validation 。

只是在我的Get方法中添加“Authorize”属性,是否让主机知道检查Authorization标头中传递的凭据? 或者我是否需要实现一些额外的东西,比如在这篇SOpost(问题部分)中: 使用自定义消息处理程序的基本身份validation ?

在我看来,我的“获取”方法需要更多,但我找不到任何好的例子来帮助我完成这个….(如果你还没弄清楚,这是我的第一个尝试使用基本身份validation和REST api /服务。

编辑:啊哈! 我越走越近了。 @ Chandermani的回复由于某种原因促使我查看我的OWN web.config并且我意识到我没有这个:

      

现在添加此选项会在导航到… / api /登录页面时提示我输入凭据。

编辑2:通过Chrome开发工具检查通过网络发送的内容,显示正在发送授权标头,同时指定基本身份validation和我的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页面提示我输入我的凭据时,它会陷入无限循环。 我会输入它们,按回车键,然后再次询问它们。

Edit3:好的,我可以validation!!! 我必须在我的用户名前面指定域名,因为我正在运行localhost …

谢谢大家指点我正确的方向!

变化的组合导致解决我的问题:

1)我需要在我的OWN web.config中允许基本身份validation。 我之前只在IISExpress applicationhost.config中设置了它(参见编辑(1))

2)显示Chrome开发工具的输出certificate基本身份validation授权标头实际上是通过其发送的。

3)最后一个问题是因为我在localhost上运行,我需要在用户名中指定要进行身份validation的域。 这可能是一种更简洁的方法,但我刚刚在我的用户名字段中输入了这个:mydomain \ ganders,它开始工作了。