AngularJS 设置 SSL Headers
AngularJS Set SSL Headers
我开始了一个新的 Yeoman AngularJS 项目,托管在 Apache 中。我正在从启用了 CORS 的 IIS 中托管的 WCF Restful 服务获取数据。我能够毫无问题地获取数据。但是,目前我每次都在 url 上传递用户名和密码,并覆盖 WCF 端的用户验证程序,这是非常糟糕的,无论如何都不安全。不要担心这只是一个开发环境。在调用 SSL 服务之前,如何使用用户凭据设置 header 值?基本上如何在进行服务调用之前在 AngularJS 中设置 Web 请求?
我最终在我的 AngularJS 应用程序上创建了一个名为 "Authorization" 的自定义 header,在应用程序上设置 header 值,然后读取 header WCF 服务上的值。
我能够做到这一点的方法如下:
首先,我必须更改 WCF 服务以允许我获取 Http 上下文。为此,我必须首先在 web.config 上启用 ASP 网络兼容性,如下所示:
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
我必须将 Global.asax 添加到我的 WebService 项目并修改 BeginRequest 事件以允许我的新自定义 header,如下所示:
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();
}
}
然后我通过向 class 添加标记来允许 ASP 服务 class 的网络兼容性,如下所示:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
此时我能够在 WCF 服务上获得 Http 上下文 headers。下面是我如何在服务代码中检索 header 值:
HttpContext.Current.Request.Headers["Authorization"]
此时,WCF 服务可以使用我的自定义 header。最后一步是从 AngularJS 服务工厂代码设置 header,如下所示:
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,接下来我将在应用程序和服务上对其进行加密和解密步骤。
我开始了一个新的 Yeoman AngularJS 项目,托管在 Apache 中。我正在从启用了 CORS 的 IIS 中托管的 WCF Restful 服务获取数据。我能够毫无问题地获取数据。但是,目前我每次都在 url 上传递用户名和密码,并覆盖 WCF 端的用户验证程序,这是非常糟糕的,无论如何都不安全。不要担心这只是一个开发环境。在调用 SSL 服务之前,如何使用用户凭据设置 header 值?基本上如何在进行服务调用之前在 AngularJS 中设置 Web 请求?
我最终在我的 AngularJS 应用程序上创建了一个名为 "Authorization" 的自定义 header,在应用程序上设置 header 值,然后读取 header WCF 服务上的值。
我能够做到这一点的方法如下:
首先,我必须更改 WCF 服务以允许我获取 Http 上下文。为此,我必须首先在 web.config 上启用 ASP 网络兼容性,如下所示:
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
我必须将 Global.asax 添加到我的 WebService 项目并修改 BeginRequest 事件以允许我的新自定义 header,如下所示:
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();
}
}
然后我通过向 class 添加标记来允许 ASP 服务 class 的网络兼容性,如下所示:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
此时我能够在 WCF 服务上获得 Http 上下文 headers。下面是我如何在服务代码中检索 header 值:
HttpContext.Current.Request.Headers["Authorization"]
此时,WCF 服务可以使用我的自定义 header。最后一步是从 AngularJS 服务工厂代码设置 header,如下所示:
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,接下来我将在应用程序和服务上对其进行加密和解密步骤。