使用Postman作为客户端和Web API 2作为服务器进行基于令牌的认证

介绍

开发包含有限资源的Web应用程序时,认证和授权是一个主要问题。我们知道基于cookie的身份验证是用于访问同一域的资源的一种认证方式。基于令牌的认证是遵循OAuth2标准的不同认证方式。基于令牌的身份验证对于访问来自其他域的意图不在同一个域中的资源非常有用。Microsoft Web API 2允许令牌库身份验证访问受限资源。

本文的内容

  1. 什么是基于令牌的认证
  2. 什么是基于Cookie的身份验证
  3. 什么是Web API
  4. 什么是邮递员
  5. 演示项目。

什么是基于令牌的认证

基于令牌的身份验证允许客户端应用程序访问服务器端应用程序的受限资源。基于令牌的身份验证使用客户端和服务器之间的承载令牌来访问资源。要获取令牌,客户端应用程序首先使用适当的凭据向Authentication Server端点发送请求。如果发现用户名和密码正确,则认证服务器将令牌作为响应发送给客户端,然后客户端应用程序使用令牌来访问下一个请求中的受限资源。ASP.Net Web API使用OWIN OAuth中间件进行身份验证服务器操作。

下图显示了Web API的身份验证服务器表示。

使用Postman作为客户端和Web API 2作为服务器进行基于令牌的认证

什么是基于Cookie的身份验证

我试图在下面的图表中表示基于cookie的身份验证。

使用Postman作为客户端和Web API 2作为服务器进行基于令牌的认证

在上图中,浏览器向服务器发送登录请求。Web服务器然后使用asp.net身份和OWIN中间件来检查用户凭据。如果用户有效,则服务器将请求的资源返回给客户端,同一时间服务器向客户端发送认证cookie。然后,浏览器将具有连续请求的认证cookie包含在服务器中以避免再次登录。

什么是Web API

简而言之,api是一个Microsoft .NET框架,它提供了RESTful的Web服务来为客户公开数据。Web api提供必要的功能来支持OAuth2协议进行身份验证。而OAuth2为安全性提供基于令牌的身份验证。

什么是邮递员

邮递员是Chrome的扩展,它用作客户端应用程序来测试Web服务和客户端之间的请求和响应。邮递员允许用户添加头和身体参数与请求。在我们的演示项目中,我们将使用Postman作为客户端应用程序从服务器获取令牌,接下来我们将使用该令牌进行身份验证。

演示项目

演示Web API项目配置为支持认证服务器,该服务器将承载令牌返回给客户端,并将天气预报作为资源包含,并将该数据作为响应发送给客户端。

我已经使用VS 2013和SQL Server 2012进行演示项目。步骤如下

  1. 使用Asp.Net Web API模板创建一个新项目。将身份验证选项更改为个人用户帐户。它将添加必要的dll,如OWIN,Identity,OAuth,并将自动配置认证服务器。解决方案资源管理器如下所示。使用Postman作为客户端和Web API 2作为服务器进行基于令牌的认证
  2. 通过使用NuGet软件包管理器搜索Cors并安装软件包来支持跨原始资源共享。下图显示了包装。使用Postman作为客户端和Web API 2作为服务器进行基于令牌的认证
  3. 打开WebApiConfig类,并将config.EnableCors()行添加到Register函数中。
  4. 在Web.config文件中添加以下连接字符串。
    <connectionStrings>
    
        <add name="DefaultConnection" connectionString="Data Source=***;Initial Catalog=WeatherForecast;User ID=sa;Password=***" providerName="System.Data.SqlClient" />
    
      </connectionStrings>
    
  5. 新的天气模型包含天气信息。
        public class Weather
        {
            public int Id { get; set; }
            public string CountryName { get; set; }
            public string Temperature { get; set; }
        }
  6. 新控制器WeatherController的Get函数返回预定义的天气信息列表。
    [Authorize]
            public List<Weather> Get()
            {
                List<Weather> OrderList = new List<Weather> 
                {
                    new Weather {Id = 1, CountryName = "Dhaka, Bangladesh", Temperature = "88 F" },
                    new Weather {Id = 2, CountryName = "Washington, DC", Temperature = "65 F" },
                    new Weather {Id = 3, CountryName = "Mumbai, Maharashtra, India", Temperature = "90 F" },
                    new Weather {Id = 4, CountryName = "London, UK", Temperature = "56 F" }
                };
    
                return OrderList;
            }

    这里[授权]过滤器用于过滤未经授权的用户访问该操作。所以客户端需要传递有效的承载令牌来访问资源。

  7. 认证服务器的默认配置如下所示
    static Startup()
            {
                PublicClientId = "self";
    
                UserManagerFactory = () => new UserManager<IdentityUser>(new UserStore<IdentityUser>());
    
                OAuthOptions = new OAuthAuthorizationServerOptions
                {
                    TokenEndpointPath = new PathString("/Token"),
                    Provider = new ApplicationOAuthProvider(PublicClientId, UserManagerFactory),
                    AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
                    AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
                    AllowInsecureHttp = true
                };
            }

    该属性在属性中定义,TokenEndpointPath是请求令牌的端点。

  8. AccountController的注册操作用于在服务器数据库中创建一个新用户。
            [AllowAnonymous]
            [Route("Register")]
            public async Task<IHttpActionResult> Register(RegisterBindingModel model)
            {
                if (!ModelState.IsValid)
                {
                    return BadRequest(ModelState);
                }
    
                IdentityUser user = new IdentityUser
                {
                    UserName = model.UserName
                };
    
                IdentityResult result = await UserManager.CreateAsync(user, model.Password);
                IHttpActionResult errorResult = GetErrorResult(result);
    
                if (errorResult != null)
                {
                    return errorResult;
                }
    
                return Ok();
            }
  9. 现在运行该项目,它将打开一个端口,并准备好接收客户端的请求。
  10. 现在,如果安装了Chrome应用列表,请打开邮递员,并将POST请求发送到服务器的帐户控制器,以注册用户名和密码的新用户作为参数。截图如下所示。

    使用Postman作为客户端和Web API 2作为服务器进行基于令牌的认证

  11. 现在,使用新创建的用户的用户名和密码作为参数,向服务器发送一个POST请求给承载令牌。添加了一个新参数grant_type,其值为'password'的请求。截图如下所示。使用Postman作为客户端和Web API 2作为服务器进行基于令牌的认证
  12. 最终请求是获取天气信息作为JSON字符串的GET请求。该请求包含名为Authorization的头参数,其值是承载令牌。以下屏幕显示详细信息。使用Postman作为客户端和Web API 2作为服务器进行基于令牌的认证

结论

总之,本文介绍了基于令牌的身份验证及其实现。基于令牌的身份验证基本上用于Web服务。这里我使用Web API作为Web服务和Postman作为客户端。演示项目显示如何创建一个Web API项目以及如何使用承载令牌应用身份验证。