在 Windows Azure Pack 中创建用户
简介
在这篇博文中,我将概述如何在 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 中创建用户包含两步:
- 在验证系统中创建用户– 要求有用户名、密码以及标识用户所需的其他信息
- 在服务管理 API 层创建用户– 要求由验证系统提供的用户名