星空网 > 软件开发 > ASP.net

webapi 中的本地登录

WebApi 身份验证方式

asp.net WebApi 中有三种身份验证方式

  • 个人用户账户。用户可以在网站注册,也可以使用 google, facebook 等外部服务登录
  • 工作和学校账户。使用活动目录,Office 365等方式进行身份验证。
  • Windows 身份验证。在局域网中使用。

个人用户账户方式下又又两种登录方式:

  • 本地登录。用户在网站注册,网站保存用户的登录名和密码散列值。登录时,用户提供登录名和密码,网站使用 asp.net identity 系统进行身份验证。
  • 社交登录。使用 google, facebook 等外部服务登录。网站仍然为用户在数据库中创建一个记录,但是不会保存凭据。用户通过登录外部服务进行身份验证。

这两种登录方式的差别在于凭据流,不管采用哪个方式,WebApi 都使用 OAuth2 进行身份验证。

OAuth2 术语

  • Resource(资源)。受保护的数据。
  • Resource Server(资源服务器)。承载资源的服务器。
  • Resouce Owner(资源所有者)。可以授权访问资源的实体,用户是典型的资源所有者。
  • Client(客户端)。访问资源的应用程序。
  • Access token(访问令牌)。允许对资源进行访问的令牌。
  • Bearer token(不记名令牌)。这是访问令牌的一种,客户端不需要对其进行加密钥,不记名令牌应仅在 HTTPS 上使用,并且设置较短的有效时间。
  • Authorization server(授权服务器)。发出令牌的服务器。

实践中,资源访问器和授权访问器可以是同一个应用程序。

本地登录的凭据流程

对于本地登录方式,WebApi 使用 OAuth2 中定义的资源所有者密码授权类型。这种授权类型适用于资源所有者十分信任客户端的情形。

  1. 用户在客户端输入登录名和密码。
  2. 客户端将登录名和密码发送给授权服务器。
  3. 授权服务器对凭据进行验证,返回访问令牌。
  4. 客户端访问受保护的资源时,将令牌放在 HTTP Authorization 请求头中。

webapi 中的本地登录

下图是实现这个流程的具体程序结构

webapi 中的本地登录

在这里,WebApi的控制器是资源服务器。Authentication Filter 对令牌进行验证,Authorization Filter 决定是否授权。授权服务器和 Authentication Filter 通过 OWIN 中间件处理 OAuth2 标准规定的细节。

AccountController 使用 asp.net identity 管理用户数据。相关文件有:

  • \App_Start\IdentityConfig.cs
  • \Controllers\AccountController.cs
  • \Models\IdentityModels.cs
  • \Providers\ApplicationOAuthProvider.cs

配置授权服务器

在 Startup.Auth.cs 文件的 ConfigureAuth 方法中进行配置。

public void ConfigureAuth(IAppBuilder app){  // 将数据库上下文和用户管理器配置为对每个请求使用单个实例  app.CreatePerOwinContext(ApplicationDbContext.Create);  app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);  // 使应用程序可以使用 Cookie 来存储已登录用户的信息  // 并使用 Cookie 来临时存储有关使用第三方登录提供程序登录的用户的信息  app.UseCookieAuthentication(new CookieAuthenticationOptions());  app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);  // 针对基于 OAuth 的流配置应用程序  PublicClientId = "self";  OAuthOptions = new OAuthAuthorizationServerOptions  {    TokenEndpointPath = new PathString("/Token"),    Provider = new ApplicationOAuthProvider(PublicClientId),    AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),    AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),    //在生产模式下设 AllowInsecureHttp = false    AllowInsecureHttp = true  };  // 使应用程序可以使用不记名令牌来验证用户身份  app.UseOAuthBearerTokens(OAuthOptions);}

 使用 TokenEndpointPath 属性配置授权服务器的终结点,应用程序通过这个URL获取不记名令牌。使用 Provider 属性配置接入到 OWIN 中间件的提供程序,用来处理中间件引发的事件。

配置使用不记名令牌

在 WebAppiConfig.Register 方法中配置 WebApi 使用不记名令牌。

public static void Register(HttpConfiguration config){  // Web API 配置和服务  // 将 Web API 配置为仅使用不记名令牌身份验证。  config.SuppressDefaultHostAuthentication();  config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));  // Web API 路由  config.MapHttpAttributeRoutes();  config.Routes.MapHttpRoute(    name: "DefaultApi",    routeTemplate: "api/{controller}/{id}",    defaults: new { id = RouteParameter.Optional }  );}

这里使用 SuppressDefaultHostAuthentication 方法通知 web api 忽略请求进入webapi管道之前的验证,包括 iis 和 owin 中间件。使用 HostAuthenticationFilter 类对不记名令牌进行验证。

获取令牌

获取令牌的基本步骤为:

  1. 程序请求 ~/Token。
  2. OAuth 中间件调用提供程序的 GrantResourceOwnerCredentials 方法。
  3. 提供程序调用 ApplicationUserManager 验证凭据,创建 claims identity。
  4. 如果验证成功,提供程序创建身份验证票(authentication ticket),身份验证票用于生成令牌。

webapi 中的本地登录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" />

 

 

 原文地址:http://www.asp.net/web-api/overview/security/individual-accounts-in-web-api

 




原标题:webapi 中的本地登录

关键词:web

web
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流