2011-08-08 69 views
1

我已将一个wcf服务部署到云中。任何人都可以通过最佳做法来指导我如何确保天蓝色的终点?Windows Azure WCF安全

谢谢。

回答

2

在我看来,最简单的方法是使用AppFabric访问控制服务(ACS)生成一个安全Web令牌(SWT),通过授权HTTP头传递给WCF服务。在服务方法中,您可以从头文件中读取并验证SWT。

这很简单,特别是如果您动态创建代理而不是使用服务引用。

这是我从ACS获得SWT:

private static string GetToken(string serviceNamespace, string issuerKey, string appliesto) 
{ 
    WebClient client = new WebClient(); 

    client.BaseAddress = String.Format("https://{0}.accesscontrol.windows.net", serviceNamespace); 
    client.UseDefaultCredentials = true; 

    NameValueCollection values = new NameValueCollection(); 

    values.Add("wrap_name", serviceNamespace); 
    values.Add("wrap_password", issuerKey); 
    values.Add("wrap_scope", appliesto); 

    byte[] responseBytes = client.UploadValues("WRAPv0.9", "POST", values); 

    string response = System.Text.Encoding.UTF8.GetString(responseBytes); 

    string token = response 
         .Split('&') 
         .Single(value => value.StartsWith("wrap_access_token=", StringComparison.OrdinalIgnoreCase)) 
         .Split('=')[1]; 

    return token; 
} 

issuerKey,因为它是在ACS V1提到现在从服务标识在ACS V2密码。

拨打服务:

string accessToken = GetToken(serviceNamespace, issuerKey, appliesto); 

string authHeaderValue = string.Format("WRAP access_token=\"{0}\"", HttpUtility.UrlDecode(accessToken)); 

// TInterface is the service interface 
// endpointName refers to the endpoint in web.config 
ChannelFactory channelFactory = new ChannelFactory<TInterface>(endpointName); 

TInterface proxy = channelFactory.CreateChannel(); 

OperationContextScope scope = new OperationContextScope(proxy as IContextChannel); 

WebOperationContext.Current.OutgoingRequest.Headers.Add(HttpRequestHeader.Authorization, authHeaderValue); 

// Call your service 
proxy.DoSomething(); 

在服务端,您提取头中的令牌和验证。如果这看起来像你想采取的方法,我可以找出代码。

尝试this blog post作者:Alik Levin是一个很好的起点。

+0

这是否适用于Java客户端?他们会很容易*能够引用sts吗?只是好奇。谢谢。 – dana

+0

是的,这种方法对于Java客户端来说应该很好。只需按照与上面的GetToken方法相同的方法。 –

2

一个典型的,广泛互操作的方法是通过SSL连接使用HTTP基本认证。在Azure中运行此方法的方法与在传统Windows服务器上实现此方法非常相似。

您可以实现一个IIS Http模块并提供您自己的BasicAuthenticationModule实现 - 不过您可以使用它,但调用ASP.NET Membership(对ValidateUser的调用)将是一种常用方法。这个商店可以托管在SQL Azure中。

然后,您可以通过实现IAuthorizationPolicy并将其添加到您的authorizationPolicies WCF配置元素中,将其表面显示为WCF。

模式和实践团队对此进行了演练,完成代码为 http://msdn.microsoft.com/en-us/library/ff649647.aspx。您可以忽略简短的Windows Forms讨论 - 作为Web服务,他们选择的客户端是无关紧要的。