AngularJS设置SSL标头

时间:2015-07-04 13:34:56

标签: angularjs wcf ssl

我已经开始在Apache中托管一个新的Yeoman AngularJS项目。我从启用了CORS的IIS中托管的WCF Restful服务获取数据。我能够毫无问题地获取数据。但是,目前我每次都在URL上传递用户名和密码,并覆盖WCF端的用户验证器,这非常糟糕,无论如何都不安全。不要担心这只是一个开发环境。在调用SSL服务之前,如何使用用户凭据设置标头值?基本上如何在进行服务调用之前在AngularJS中设置Web请求?

1 个答案:

答案 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中,我将在应用和服务上加密和解密,作为下一步。