Azure.NET服务访问控制实现指南
立即解锁
发布时间: 2025-08-25 01:50:42 阅读量: 2 订阅数: 4 


Windows Azure入门与实践指南
### Azure .NET服务访问控制实现指南
#### 1. 服务实现与配置
首先,我们来看服务的实现和配置部分。以下是服务的实现代码:
```csharp
private User _registeredUser = null;
#region IUserRegisterService Members
public string Ping()
{
return string.Format("--- I am here <{0}>", this.ToString());
}
public void RegisterUser(string xmlString)
{
try
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xmlString);
XmlSerializer serializer = new XmlSerializer(typeof(User));
StringReader reader = new StringReader(xmlString);
_registeredUser = (User)serializer.Deserialize(reader);
}
catch (Exception ex)
{
}
}
public string GetRegisteredUser()
{
XmlSerializer serializer = new XmlSerializer(typeof(User));
StringBuilder sb = new StringBuilder();
StringWriter writer = new StringWriter(sb);
serializer.Serialize(writer, _registeredUser);
return writer.GetStringBuilder().ToString();
}
#endregion
```
服务主机的实现如下:
```csharp
using System;
using System.Security.Cryptography.X509Certificates;
using System.ServiceModel;
using System.ServiceModel.Description;
namespace AzureForDotNetDeveloper.DotNetService.ServiceBus
{
class Program
{
static void Main(string[] args)
{
ServiceHost host = new ServiceHost(typeof(AzureForDotNetDeveloperWCFservice));
host.Open();
Console.WriteLine("---UserRegister service is running.");
Console.WriteLine("---Press <Enter> to terminate server");
Console.ReadLine();
host.Close();
}
private static string ReadSolutionName()
{
Console.Write(
string.Format(
"---Please enter your solution name: {0}",
Environment.NewLine
)
);
return Console.ReadLine();
}
}
}
```
服务主机的配置文件如下:
```xml
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="basicHttpBinding1" />
</basicHttpBinding>
</bindings>
<services>
<service behaviorConfiguration="UserRegisterServiceBehavior"
name="AzureForDotNetDeveloper.DotNetService.ServiceBus.AzureForDotNetDeveloperWCFservice">
<endpoint address=""
binding="basicHttpBinding"
bindingConfiguration=""
name="UserRegisterEndpoint"
contract="AzureForDotNetDeveloper.DotNetService.ServiceBus.IAzureForDotNetDeveloperWCFservice" />
<endpoint address="mex"
binding="mexHttpBinding"
name="mexEndpoint"
contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost/AzureForDotNetDeveloperWCFservice" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="UserRegisterServiceBehavior">
<serviceMetadata httpGetEnabled="True"
httpGetUrl="http://localhost/AzureForDotNetDeveloperWCFservice/wsdl" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
```
#### 2. 客户端实现与配置
客户端代理类需要从Visual Studio生成。具体步骤如下:
1. 编译并启动服务器。
2. 当服务器运行时,右键单击客户端项目的“References”节点,从上下文菜单中选择“Add Service Reference”,弹出“Add Service Reference”对话框。
3. 在地址文本框中输入服务地址`http://localhost/AzureForDotNetDeveloperWCFservice`,在命名空间文本框中输入客户端类的名称,以生成客户端代理类。
以下是客户端使用代理的实现代码:
```csharp
static void Main(string[] args)
{
UserRegisterServiceClient.UserRegisterServiceClient client =
new UserRegisterServiceClient.UserRegisterServiceClient();
try
{
Console.WriteLine(string.Format("--- Ping server return = <{0}>{1}",
client.Ping(),
Environment.NewLine));
User user = new User();
user.FirstName = "Henry";
user.LastName = "Li";
user.Password = "Hello Azure WCF host";
user.TimeRegistered = DateTime.Now;
XmlSerializer serializer = new XmlSerializer(user.GetType());
StringBuilder sb = new StringBuilder();
StringWriter writer = new StringWriter(sb);
serializer.Serialize(writer, user);
client.RegisterUser(writer.GetStringBuilder().ToString());
string xmlString = client.GetRegisteredUser();
XmlSerializer deSerializer = new XmlSerializer(typeof(User));
StringReader stringReader = new StringReader(xmlString);
User registeredUser = (User)serializer.Deserialize(stringReader);
Console.WriteLine(
string.Format("--- User <{0} {1}> register success @[{2}].{3}",
registeredUser.FirstName,
registeredUser.LastName,
registeredUser.TimeRegistered.ToString(),
Environment.NewLine));
}
catch (Exception e)
{
DumpException(e);
}
client.Close();
Console.WriteLine();
Console.WriteLine("Press <ENTER> to exit client.");
Console.ReadLine();
}
static void DumpException(Exception e)
{
Console.WriteLine(e.Message);
}
```
#### 3. 测试已构建的内容
完成上述开发后,我们可以进行测试:
1. 如果服务器尚未运行,请启动服务器。在本例中,服务器以本地主机方式运行。
2. 在浏览器中输入服务地址`http://localhost/AzureForDotNetDeveloperWCFservice`,应看到相应结果。
3. 运行客户端程序,应看到服务器的响应,并且用户已成功注册。
#### 4. 认证方式
访问控制服务可以使用CardSpace进行交互式认证,也可以使用X.509证书进行认证。在讨论使用X.509和CardSpace认证的访问控制服务之前,需要在本地开发环境中进行一些配置。
##### 4.1 安装X.509证书
安装X.509证书的步骤如下:
1. 解压源代码,在子文件夹“Certificate”中找到生成的证书文件`localhost.cer`。
2. 右键单击该文件,选择“Install Certificate”。
3. 按照向导步骤将证书安装到“Trusted Root Certificate Authorities/Local Computer/Certificates”存储区。
4. 点击Windows开始按钮,在搜索栏中输入“mmc”,打开“mmc.exe”实用程序。
5. 从“File”菜单中选择“certmgr.msc”证书管理插件。
6. 安装成功后,获取证书的指纹详细信息,并将数据复制到服务项目配置文件`App.config`的`<behavior>`部分,如下所示:
```xml
<behaviors>
<serviceBehaviors>
<behavior name="UserRegisterServiceBehavior">
<serviceMetadata httpGetEnabled="True"
httpGetUrl="http://localhost/AzureForDotNetDeveloperWCFservice/wsdl" />
<serviceDebug includeExceptionDetailInFaults="True" />
<serviceCredentials>
<clientCertificate>
<authentication certificateValidationMode="True" />
</clientCertificate>
<serviceCertificate storeLocation='LocalMachine'
storeName='My'
x509FindType='FindByThumbprint'
findValue='01 20 90 8a 7e 12 52 45 9b 37 4b 92 64 14 18 e8 0d 12 63 fc' />
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
```
##### 4.2 将证书关联到Azure应用程序URL
将安装的X.509证书关联到Azure应用程序的步骤如下:
1. 登录Azure门户,导航到“.NET Access Control”中的“X.509 Certificates”,选择“Basic”配置。
2. 在“X.509 Certificates”设置页面中,输入WCF服务的端点地址。
3. 取消选中“Retrieve certificate from URL (http or https)”框,然后选择“Browse”。
4. 导航到Microsoft .NET Services SDK Tools文件夹,启动`RegCert.exe`生成验证码。
5. 复制生成的代码并粘贴到“Verification Code”框中。
6. 点击“Save”按钮将证书关联到WCF服务。如果同一URL已经关联了证书,将会出现错误消息,需要返回上一页选择“Advanced”配置进行修复。
#### 5. 使用CardSpace进行认证
使用CardSpace进行认证的步骤如下:
1. 登录Azure服务平台门户,导航到“Windows CardSpace Card Setup”页面。
2. 如果没有卡片,添加一张新卡片,创建并发送到Azure。
3. 点击发送按钮将卡片发送到Azure进行关联,设置将保存文件,文件名必须唯一,不允许重复。
4. 生成的CardSpace需要在运行时进行交互式认证之前进行注册。可以从Azure门户中进行注册。
#### 6. 修改代码以使用CardSpace .NET访问控制服务
创建一个新的项目“FederateAccessManager”,并向该项目中添加三个类,这些类都派生自`System.ServiceModel.Security`命名空间的类,具体信息如下表所示:
| 类名 | 派生自 | 重写方法 | 输入参数 | 输出 |
| --- | --- | --- | --- | --- |
| UserRegisterServiceCredentials | ServiceCredentials | CloneCore, CreateSecurityTokenManager | | |
| UserRegisterSecurityTokenManager | ServiceCredentialsSecurityTokenManager | CreateSecurityTokenAuthenticator | SecurityTokenRequirement | SecurityTokenAuthenticator, SecurityTokenResolver |
| UserRegisterTokenAuthenticator | SamlSecurityTokenAuthenticator | ValidateTokenCore | SecurityToken | ReadOnlyCollection<IAuthorizationPlicy> |
以下是这些类的实现代码:
```csharp
// UserRegisterServiceCredentials类实现
using System;
using System.IdentityModel.Selectors;
using System.ServiceModel.Description;
namespace AzureForDotNetDeveloper.DotNetService.ServiceBus
{
public class UserRegisterServiceCredentials : ServiceCredentials
{
String solutionName;
public UserRegisterServiceCredentials(String solutionName)
: base()
{
this.solutionName = solutionName;
}
protected override ServiceCredentials CloneCore()
{
return new UserRegisterServiceC
```
0
0
复制全文
相关推荐










