三、ASP.NET Web API 的身份识别系统

本章实际说明了如何集成 ASP。 asp.net 身份识别系统。 净 Web API。 ASP。 asp.net 身份识别系统是对 asp.net 的一个升级.NET 会员和简单会员系统。 它具有用户配置文件支持,OAuth 集成,并且在 ASP 中可用。 Visual Studio 2013/2015 的 asp.net 模板。

在本章中,我们将涵盖以下主题:

  • 创建一个空的 Web API 应用
  • 安装 ASP.NET Identity NuGet 包
  • 设置 ASP。 2.1 网络身份
  • 定义 Web API 控制器和方法

创建空 Web API 应用

让我们创建一个空的 Web API 来集成 ASP。 净的身份。 遵循以下步骤:

  1. 在 Visual Studio 的Start页面中创建新项目
  2. 选择 Visual c# Installed Template 命名为Web
  3. 选择ASP.NET Web 应用
  4. Name the project ContactLookupWithAspNetIdentity and click on OK:

    Creating an Empty Web API Application

    图 1 -我们已经命名了 ASP.NET Web 应用作为 ContactLookupWithAspNetIdentity

  5. 新 ASP. net 中,选择模板.NET 项目对话框。

  6. Check Web API and click OK under Add folders and core references:

    Creating an Empty Web API Application

    图 2 -选择 ASP。 应用“ContactLookupWithAspNetIdentity”的 NET Web API 模板

创建的空 Web API 的解决方案生成以下文件:

Creating an Empty Web API Application

图 3 -空 ASP 的解结构.NET Web API 应用“ContactLookupWithAspNetIdentity”

安装 ASP.NET Identity NuGet 包

我们创建了一个空的 Web API Web 应用。 现在我们需要安装所需的 NuGet 包来集成 ASP.NET 身份到 Web API。 让我们在 NuGet 包管理器控制台下执行以下语句来安装 ASP.NET Identity 2.1 包到创建的应用:

Install-Package Microsoft.AspNet.Identity.Core
Install-Package Microsoft.AspNet.Identity.EntityFramework 
Install-Package Microsoft.AspNet.Identity.OWIN
Install-Package Microsoft.OWIN.Cors
Install-Package Microsoft.AspNet.WebApi.OWIN
Install-Package Microsoft.OWIN.Security.OAuth

我们也可以安装 ASP.NET Identity 2.1 使用基于 ui 的 Nuget 包管理器,如下截图所示:

Installing the ASP.NET Identity NuGet packages

图 4 -安装 ASP.NET Identity 2.0 相关包使用 NuGet 包管理器

建立 ASP。 2.1 网络身份

我们已经创建了一个空的 Web API,并为 ASP 安装了必要的 NuGet 包.NET Identity andOpen Web Interface for . NET(OWIN) 现在让我们添加所需的类文件来集成 ASP.NET 身份到 Web API。

净的身份

ASP.NET Identity 是微软提供的一个框架,它建立在 OWIN 中间件之上,用于管理 ASP 中的用户身份和成员资格.NET 应用,如 Web Forms、MVC 和 Web API。 我们将使用 ASP.NET 身份认证系统使用内置的身份用户域模型IdentityUser注册和管理身份用户。 如果您计划在您的应用中拥有额外的属性,那么您将需要创建一个具有额外属性的域模型IdentityUser。 让我们为用户定义一个自定义实体框架类,该类具有应用特定的属性,比如名和姓。 我们还需要定义一个 db context 来处理与数据库的通信:

  1. Let's create a class named ApplicationUser inheriting IdentityUser in the Models folder:

    ``` public class ApplicationUser : IdentityUser { [Required] [MaxLength(50)] public string FirstName { get; set; }

    [Required]
    [MaxLength(50)]
    public string LastName { get; set; }
    

    } ```

    这个扩展标识用户类包含特定于应用的额外属性,例如FirstNameLastName数据,用所需的和最大长度的验证属性进行注释。

  2. Now, add a class named ApplicationDbContext to the Models folder to manage communication with db:

    ```
    public class ApplicationDbContext : IdentityDbContext
    {
    public ApplicationDbContext()
    base("DefaultConnection", throwIfV1Schema: false) { Configuration.ProxyCreationEnabled = false; Configuration.LazyLoadingEnabled = false; }

    public static ApplicationDbContext Create() { return new ApplicationDbContext(); } } ```

    我们刚刚创建了一个继承了IdentityDbContextApplicationDbContext类文件,它将有助于在 SQL Server 中管理特定于身份的表。 如您所见,我们将连接字符串名称作为参数传递给基构造函数,以便可以使用它来标识各自的服务器和数据库名称。

  3. Let's now add the connection string to the web.config file that will point to the database, which will be created using code first approach:

    <connectionStrings> <add name="DefaultConnection" connectionString="(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\AspNetIdentity.mdf;Initial Catalog=AspNetIdentity;Integrated Security=True" providerName="System.Data.SqlClient" /> </connectionStrings>

    我们添加了所需的连接字符串。 现在,我们需要首先启用将生成代码的实体框架代码迁移,以便从域模型代码更新数据库模式。

  4. 要添加 NuGet 包进行迁移,请在 NuGet 包管理控制台执行以下命令:

    enable-migrations add-migration AspNetDbCreate update-database

    • enable-migrations命令在ContactLookupWithAspNetIdentity项目中创建Migrations文件夹,并生成一个名为Configuration的文件。 方法将运行或测试应用所需的基本数据添加到 db 中。
    • add-migration AspNetDbCreate命令在Migrations文件夹中生成<timestamp>_AspNetDbCreate.cs代码以创建数据库。 如果您注意到,该文件还包含方法Up中的ApplicationUser类中扩展的特定于应用的数据属性的代码。
    • update-database命令执行配置文件中的Up方法和Seed方法中的代码。

下图显示了添加所需文件并启用迁移后的解决方案结构:

ASP.NET Identity

图 5 -带 Db Migration 配置文件的“ContactLookupWithAspNetIdentity”解决方案结构

  1. 添加UserManager类来管理ApplicationUser实例。 为此,让在App_Start中创建一个名为IdentityConfig.cs的文件作为标准,并为UserManager类添加以下代码:

    ``` public class ApplicationUserManager : UserManager { public ApplicationUserManager(IUserStore store) : base(store) { }

    public static ApplicationUserManager Create(IdentityFactoryOptions options, IOWINContext context) { var appDbContext = context.Get(); var appUserManager = new ApplicationUserManager(new UserStore(appDbContext));

    return appUserManager; } } ```

我们还可以在ApplicationUserManager类的 create 方法中添加代码,为用户名和密码配置验证逻辑,为电子邮件和 SMS 实现双因素认证提供者,并为 Web API 启用基于角色的授权。

下面的代码添加了验证用户概要文件的规则。 根据代码,用户名被限制只接受字母数字用户名(用户名应该以字母开头),电子邮件地址应该是有效的和强制性的:

manager.UserValidator = new UserValidator<ApplicationUser>(manager)
{
    AllowOnlyAlphanumericUserNames = true,
    RequireUniqueEmail = true
};

下面的代码添加了验证密码的规则,以限制密码的最小和最大长度,并由至少一个特殊字符、数字和至少一个大写或小写字母组成:

manager.PasswordValidator = new PasswordValidator
{
    RequiredLength = 6,
    RequireNonLetterOrDigit = true,
    RequireDigit = true,
    RequireLowercase = true,
    RequireUppercase = true,
};

ApplicationUserManager类中的静态Create方法将作为回调方法注册在Startup.Auth.cs中,该回调方法将被调用以创建ApplicationUserManager的实例。 该实例将存储在OWINContext中,可以通过调用context.Get方法获得:

添加以下代码的 OWIN 启动类到App_Start文件夹:

public partial class Startup
{

   public void Configuration(IAppBuilder app)
   {
  HttpConfiguration httpConfig = new HttpConfiguration();

  ConfigureOAuthTokenGeneration(app);

  ConfigureWebApi(httpConfig);

  app.UseCors(Microsoft.OWIN.Cors.CorsOptions.AllowAll);

  app.UseWebApi(httpConfig);

   }

   private void ConfigureOAuthTokenGeneration(IAppBuilder app)
   {  
  app.CreatePerOWINContext(ApplicationDbContext.Create);
     app.CreatePerOWINContext<ApplicationUserManager>(ApplicationUserManager.Create);
   }

   private void ConfigureWebApi(HttpConfiguration config)
   {
  config.MapHttpAttributeRoutes();

  var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
  jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
   }
}

这个Startup类为您提供了配置授权信息和 Web API HTTP、设置 CORS、JSON 类型格式化器等的可访问性的能力。

应用用户管理器实例在帐户控制器中通过注入构造函数或从OWINContext在 Request 对象中可用。 应用用户管理器的实例提供了获取身份用户信息、更改密码、为身份用户添加外部登录信息、删除身份用户的本地或外部登录、注册用户和添加登录信息的方法。

定义 Web API 控制器和方法

到目前为止,我们创建了一个空的 ASP.NET Web API 应用。 我们为 ASP 安装了必要的 NuGet 包.NET 身份和 OWIN 集成。 我们还为身份用户和 db 上下文添加了代码,并为实体框架代码首先迁移启用了 db 迁移。 现在让我们将添加所需的控制器和方法到管理应用标识系统中的用户帐户。

创建一个名为AccountsController的控制器,并添加以下代码:

namespace ContactLookupWithAspNetIdentity.Controllers
{
    [RoutePrefix("api/accounts")]
    public class AccountsController : ApiController
    {
        public ApplicationUserManager UserManager
        {
            get
            {
                return Request.GetOWINContext().GetUserManager<ApplicationUserManager>();
            }
        }

        [Route("user/{id:guid}")]
        public async Task<IHttpActionResult> GetUserById (string Id)
        {
            var user = await UserManager.FindByIdAsync(Id);
            if (user != null)
            {
                return Json(user);
            }

            return NotFound();
        }

        [Route("user/{username}")]
        public async Task<IHttpActionResult> GetUserByName(string username)
        {
            var user = await UserManager.FindByNameAsync(username);

            if (user != null)
            {
                return Json(user);
            }
            return NotFound();

        }

[HttpPost]
        [Route("Register")]
        public async Task<IHttpActionResult> Register([FromBody] UserViewModel userVM)
        {
            var user = new ApplicationUser() { 
                UserName = userVM.UserName, 
                Email = userVM.Email, 
                FirstName = userVM.FirstName, 
                LastName = userVM.LastName 
            };

            IdentityResult result = await UserManager.CreateAsync(user, "password@1");

            if (!result.Succeeded)
            {
                return InternalServerError();
            }

            return Ok();
        }
    }
}

AccountsController中有三种方法,即GetUserByIdGetUserByNameGetRegister。 注意,Register方法被实现为HttpPost以接受 POST 主体的用户实例,并将此身份用户插入到数据库中。 GetUserByIdGetUserByName方法将返回与相应 ID 或名称匹配的用户信息。

测试应用

我们刚刚创建了所需的控制器和方法,以便为ContactLookup这样的应用管理身份用户。 现在,让我们测试AccountsController以验证已实现的插入身份用户并基于其 ID 或名称获取身份用户的方法是否正常工作。

让我们首先使用Fiddler工具调用Register方法,如下截图所示:

Testing the application

图 6 - POST 用户实例到 ASP.NET Web API 注册方法在帐户控制器

正如你可以看到的,我们通过Fiddler使用POST动作将用户实例发布到 Web APIRegister方法:

Testing the application

图 7 - 200 OK 响应,表示已创建用户

Web API 返回一个带有 HTTP 状态码200 OK的响应。 这意味着新的身份用户已经创建并插入到身份数据库中,如下截图所示:

Testing the application

图 8 -将注册身份用户添加到数据库中

现在,让我们尝试通过将用户 ID (GUID)传递给 Web API 操作方法来获取插入的用户详细信息,如下面的截图所示:

Testing the application

图 9 -对传递用户 ID 的 User 方法应用 GET 操作

如您所见,我们将GET操作应用于附加用户插入的标识的 GUID 的 URL,然后我们收到了匹配用户的 XML/JSON 格式的用户详细信息。

现在,让我们通过将用户名传递给 Web API 操作方法来获取插入的用户详细信息,如下面的截图所示:

Testing the application

图 10 -对传递 username 的 User 方法应用 GET 动作

类似地,我们通过应用GET方法将身份用户的用户名附加到 URL 中。 响应包含 XML/JSON 格式的匹配用户详细信息。

现在,Web API 已经准备好了.NET 身份识别系统集成。 因此,利用 ASP 提供的内置功能可以方便地管理身份用户。 净的身份系统。 接下来,您可以添加LookupController和必要的方法来返回联系人的详细信息。

总结

这很容易,不是吗? 我们只是集成了 APS.NET 身份,以管理身份用户和成员。

您学习了如何一步一步地创建一个空 ASP.NET Web API 项目,用于集成 asp.net。 净的身份。 然后我们安装了必要的 ASP.NET Identity NuGet 包作为集成过程的一部分。

您还学习了如何定义控制器和方法,以便管理应用的身份用户和成员关系。

最后,您学习了如何测试 ASP.NET 身份集成与一个空的 Web API 创建。 现在,我们有了必要的控制器和方法来管理ContactLookup的应用用户。 接下来,您可以创建其他需要的控制器来启用搜索ContactLookup服务的可用联系人。

你学习了 ASP.NET 身份集成到 Web API。 在下一章中,您将使用 OAuth2 保护 Web API。

把那些安全墙竖起来!