我已经开始在Apache中托管一个新的Yeoman AngularJS项目。我从启用了CORS的IIS中托管的WCF Restful服务获取数据。我能够毫无问题地获取数据。但是,目前我每次都在URL上传递用户名和密码,并覆盖WCF端的用户验证器,这非常糟糕,无论如何都不安全。不要担心这只是一个开发环境。在调用SSL服务之前,如何使用用户凭据设置标头值?基本上如何在进行服务调用之前在AngularJS中设置Web请求?
答案 0 :(得分:0)
我最终在我的AngularJS应用程序上创建了一个名为“Authorization”的自定义标头,在应用程序上设置标头值,然后在WCF服务上读取标头值。
我能够实现这一目标的方式如下:
首先,我必须更改WCF服务以允许我获取Http Context。为此,我必须首先在web.config上启用ASP Net Compatibility,如下所示:
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
我必须在我的WebService项目中添加一个Global.asax并修改BeginRequest事件以允许我的新自定义标题如下:
protected void Application_BeginRequest(object sender, EventArgs e)
{
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Authorization");
if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
{
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "POST, PUT, DELETE");
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
HttpContext.Current.Response.End();
}
}
然后我通过在类中添加标记来允许服务类的ASP Net兼容性:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
此时我能够在WCF服务上获得Http Context头。以下是我在服务代码中检索标头值的方法:
HttpContext.Current.Request.Headers["Authorization"]
此时,WCF服务可以使用我的自定义标头。最后一步是从AngularJS服务工厂代码中设置标题,如下所示:
app.factory('serviceFactory', ['$http', function ($http) {
var urlBase = 'https://domainName.com/MyService.svc/';
var dataFactory = {};
var success = {};
serviceFactory.Login = function (username, password) {
return $http({
url: urlBase + "WebServiceLoginMethodName",
type: 'GET',
dataType: 'json',
headers: { 'Authorization': "Basic " + username + ":" + password }
});
};
这不会触发Web服务上的用户验证器,但这确实让我将用户名和密码放在Http Headers中,我将在应用和服务上加密和解密,作为下一步。