65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP.NET Identity 配合 Azure 存储表

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.60/5 (3投票s)

2015年11月1日

CPOL

4分钟阅读

viewsIcon

26188

如何:使用 Azure 存储表进行 ASP.NET Identity

引言

本教程旨在填补有关如何使用 Azure 存储表的 ASP.NET Identity 的空白,这对于许多人来说,比使用默认的 SQL Server LocalDB 和 EntityFramework 来说是一个更好的选择。

背景

Using the Code

可下载的项目使用单页应用程序模板,并且已完成所有这些步骤。在使用它之前,必须配置 AzureStore 的连接字符串。我还删除了所有 NuGet 包,以便文件大小低于 10MB,Visual Studio 应该在构建解决方案时恢复它们。

  1. 创建一个 ASP.NET(已测试 4.5 或更高版本)Web 应用程序,并使用 MVC、Web API 或单页应用程序模板,保留默认的**Individual User Accounts**身份验证。
  2. 来自 NuGet
    1. 安装程序包 WindowsAzure.Storage
    2. 删除这些程序包
      1. Microsoft.AspNet.Identity.EntityFramework
      2. EntityFramework
    3. [可选] 在程序包管理器控制台中,运行 Update-Package 以更新所有内容
  3. Models文件夹中,创建一个类来匹配您的 Azure 存储表用户数据 - 此处命名为AzureTableUser
    1. 该类必须继承自TableEntityIUser
    2. 实现IUser接口(右键单击 > 实现接口)
      1. 在我的例子中,ID 变量未使用,所以我让它返回UserName
      2. 我将UserName变量设为自动实现的属性,因为这在我的情况下已足够
    3. 添加这些属性
      1. public string Password { get; set; }
      2. public string Email { get; set; }
      3. public int FailedLogIns { get; set; }
      4. public DateTimeOffset LockOutEndDate { get; set; }
      5. 如果您要使用Roles,请添加public IList<string> Roles { get; set; }
      6. 如果您要使用Claims,请添加public IList<string> Claims { get; set; }
  4. helpers文件夹中,创建一个类来处理您的存储表 - 此处命名为AzureStore
    1. 如果需要,请为您的模型命名空间添加using语句
    2. 该类必须至少继承自Microsoft.AspNet.Identity命名空间中的 4 个接口,它们是
      1. IUserStore<AzureTableUser>
      2. IUserPasswordStore<AzureTableUser>
      3. IUserLockoutStore<AzureTableUser, TKey>
      4. IUserTwoFactorStore<AzureTableUser, TKey>
    3. 我使用string作为LockoutTwoFactor存储的TKey,因为这样就可以使用string来实现GetUserById/GetUserByName
    4. 实现所有接口。我建议使用#region指令来分隔实现。
    5. 添加一个private readonly CloudTable cloudTable字段,它将负责在您的存储表上执行命令。
    6. 创建一个构造函数,并执行以下操作以获取对表的引用
      1. StorageUri storageUri = new StorageUri(new Uri("https://yourstorageaccountname.table.core.windows.net/"));
      2. CloudStorageAccount csa = CloudStorageAccount.Parse("connectionString");
      3. cloudTable = csa.CreateClouldTableClient().GetTableReference("yourTableName");
  5. 打开主Web.config文件,并删除EntityFramework部分。
  6. 打开Startup.Auth(来自App_Start
    1. 删除不必要的using语句
    2. ConfigureAuth下,删除第一个CreatePerOwinContext调用,因为我们不会使用模板创建的数据库
    3. 注释掉在新CookieAuthenticationOptions中分配OnValidateIdentity的行 - 除非在 AzureTableUser 中实现,否则此功能无效
  7. Models文件夹中,删除IdentityModels.cs文件,因为它将不会被使用
  8. 打开IdentityConfig (来自App_Start
    1. 删除不必要的using语句
    2. 除非您要实现自定义的电子邮件和/或短信双因素身份验证,否则请删除EmailServiceSmsService
      1. ApplicationUserManager类的create函数中,删除对 new EmailService和 new SmsService的调用
    3. 对于每个对默认ApplicationUser类的调用,将其更改为 AzureTableUser
    4. Create下的 new ApplicationuserManager调用中,将新创建的AzureStore类的实例作为参数传递给创建此实例的步骤 7。
    5. ApplicationSignInManager类中,删除对CreateUserIdentityAsync的重写
  9. 打开AccountController
    1. 将对默认ApplicationUser的调用更改为 AzureTableUser
    2. 删除对上述类的 Hometown 属性的调用,除非您已实现
  10. 打开ManageController
    1. 将对user.PasswordHash的调用更改为user.Password
    2. 如果您在 AzureTableUser 类中实现了电话号码属性,请将对user.PhoneNumber的调用更改为该属性。
    3. 否则,请删除与电话号码相关的所有视图和方法。
  11. 打开MeController
    1. 删除不必要的using语句
    2. 除非您已实现,否则在Get方法中删除对user.Hometown的调用

关注点

在首次执行此操作时,我发现创建AzureStore类可能相当具有挑战性。即使您不打算锁定账户或使用双因素身份验证,该存储也必须实现这些接口并且不能抛出异常,因此至少必须进行虚拟/硬编码的实现。

历史

  • 2015/11/1:第一个版本
© . All rights reserved.