在 Windows Azure Pack 中创建用户

原文地址:https://blogs.technet.com/b/privatecloud/archive/2014/02/03/creating-users-in-windows-azure-pack.aspx

简介

在这篇博文中,我将概述如何在 WAP 中创建用户,以及如何让他们登录。您可能知道,验证和授权过程分属不同实体,因此这个堆栈足够灵活,可以插入自定义的验证系统(例如 AD FS)。

在快捷安装中,验证过程在租户验证网站上执行(用户在网站输入他们的凭据),授权过程在服务管理 API 层执行。因此,需要在这两个地方都添加用户信息,用户才能登录和访问他们的订阅。

这篇博文将介绍如何在租户验证网站和服务管理 API 层创建用户。

提示:如果系统上插入了其他身份提供程序,则应该在该系统上创建用户,而不是在服务管理API 层创建用户。在租户验证网站上创建用户这节不适合您。

可以从https://go.microsoft.com/fwlink/?LinkId=324039下载这篇博文要讨论的示例项目‘UserSignUp’。

在验证系统中创建用户

正如前面的提示中所说,如果在 WAP 栈中插入了自定义的身份提供程序,则应该按照适当的步骤将用户加入这个身份系统。这一节适用于使用自带租户验证网站的情况。

租户验证网站使用自带的 ASP.NET 成员提供程序来提供身份。所以可以使用标准的 ASP.NET 成员API 在数据库中创建用户。关于成员提供程序的更多信息,可以在这里找到:https://msdn.microsoft.com/en-us/library/system.web.security.membershipprovider.aspx

ASP.NET 成员 API 要求的信息在 App.Config 中指定,包括指定到成员数据库的连接字符串,以及描述 ASP.NET 成员提供程序的一些信息。请将以下代码中的连接字符串替换为指向您所使用的数据库,并使用合适的验证方法。

    1: <connectionStrings>
    2:   <!-- Modify the connection string to point to the Windows Azure Pack Membership Database -->
    3:   <add name="WapMembershipDatabase" connectionString="Data Source=DatabaseName;User Id=sa; Password=password; Initial Catalog=Microsoft.MgmtSvc.PortalConfigStore;" />
    4: </connectionStrings>
    5: <system.web>
    6:   <membership defaultProvider="SqlProvider" hashAlgorithmType="HMACSHA256">
    7:     <providers>
    8:       <clear />
    9:       <add name="SqlProvider" type="System.Web.Security.SqlMembershipProvider"
   10:            enablePasswordRetrieval="false" 
   11:            enablePasswordReset="true" 
   12:            requiresQuestionAndAnswer="false"
   13:            requiresUniqueEmail="false" 
   14:            maxInvalidPasswordAttempts="5" 
   15:            minRequiredPasswordLength="8" 
   16:            minRequiredNonalphanumericCharacters="0"
   17:            passwordAttemptWindow="30" 
   18:            applicationName="/" 
   19:            passwordCompatMode="Framework40"
   20:            connectionStringName="WapMembershipDatabase"
   21:            passwordFormat="Hashed" />
   22:     </providers>
   23:   </membership>

提示:如果已经在使用Windows Azure Pack 的预览版,则必须更新用户创建逻辑,使用SHA-256 加密生成密码哈希值(在App.Config 中由 ‘hashAlgorithmType’ 的值指定)。

设置完成后,必须调用 CreateUser() 方法在成员数据库中创建用户。请注意,我指定用电子邮件地址作为用户名,这符合 ASP.Net 成员提供程序的要求。

    1: Membership.CreateUser(emailAddress, password, emailAddress);

在服务管理 API 中创建用户

这是启用用户授权的第二步。Windows Azure Pack 提供了协助在 API 层创建用户的 PowerShell 命令。除此之外,还可以使用 Admin APIClient 接口,这个接口可以在https://www.microsoft.com/en-us/download/details.aspx?id=41146 的示例代码中找到。

这两种方法都要得到管理员的令牌,向服务管理 API 层发送一个创建用户的调用。

PowerShell

可以使用 Get-MgmtSvcToken 方法从 Windows 验证网站得到令牌。如果使用其他身份提供程序,必须采用相应的方法获得令牌。

    1: $token = Get-MgmtSvcToken -Type 'Windows' -AuthenticationSite 'https://myenvironment:30072' -ClientRealm 

有了身份令牌之后,可以使用 Add-MgmtSvcUser 命令创建租户用户。

    1: Add-MgmtSvcUser  -AdminUri 'https://myenvironment:30004' -Token $token -Name 'user@address.com' -email 'u

 提示:如果在具有自签名证书的测试环境中使用这个代码段,不要忘记使用 DisableCertificateValidation 参数。对于从可信 CA 得到证书的生产环境,不应该需要这个参数。

C#

Admin API Client 样本提供了一个方便的接口,可以执行 Windows Azure Pack 的全部管理操作。前面提到过,可以从 Windows Azure Pack: Service Management API Samples 页面下载这个 API 客户端。以下示例使用 API Client 解决方案中的一个方法。除了使用 API Client,还可以使用如何创建Windows Azure Pack 租户用户中的引用对 API 层直接进行原始的 Http 调用。

请使用 App.Config 文件指定应用程序设置(也可以在主方法内指定这些设置)。

    1: <appSettings>
    2:   <add key="windowsAuthEndpoint" value="https://myenvironment:30072" />
    3:   <add key="adminDomainName" value="domain" />
    4:   <add key="adminUsername" value="administrator" />
    5:   <add key="adminPassword" value="password" />
    6:   <add key="adminApiEndpoint" value="https://myenvironment:30004" />
    7: </appSettings>

从 App.Config 读取值,使用下面的代码片段在 API 层创建用户。

提示: TokenIssuer.GetWindowsAuthToken() 方法在 API Clients 解决方案内,可以从 Windows Azure Pack: Service Management API Samples 页面下载。

    1: string windowsAuthEndpoint = ConfigurationManager.AppSettings["windowsAuthEndpoint"];
    2: string adminDomainName = ConfigurationManager.AppSettings["adminDomainName"];
    3: string adminUsername = ConfigurationManager.AppSettings["adminUsername"];
    4: string adminPassword = ConfigurationManager.AppSettings["adminPassword"];
    5: string adminApiEndpoint = ConfigurationManager.AppSettings["adminApiEndpoint"];
    6: string username;
    7: string password;
    8: var token = TokenIssuer.GetWindowsAuthToken(windowsAuthEndpoint, adminDomainName, adminUsername, adminPassword);
    9: using (var myAdminClient = new AdminManagementClient(new Uri(adminApiEndpoint), token))
   10: {
   11:    var userInfo = new User()
   12:    {
   13:         Name = emailAddress,
   14:         Email = emailAddress,
   15:         State = UserState.Active,
   16:     };
   17:     return myAdminClient.CreateUserAsync(userInfo).Result;
   18: }

 总之,在 WAP 中创建用户包含两步:

  1. 在验证系统中创建用户– 要求有用户名、密码以及标识用户所需的其他信息
  2. 在服务管理 API 层创建用户– 要求由验证系统提供的用户名