使用Oauth构建webapp应用
一、什么是OAuth
OAuth是一个关于授权(Authorization)的开放网络标准,目前的版本是2.0版。注意是Authorization(授权),而不是Authentication(认证)。用来做Authentication(认证)的标准叫做openid connect,我们将在以后的文章中进行介绍。
二、名词定义
理解OAuth中的专业术语能够帮助你理解其流程模式,OAuth中常用的名词术语有4个,为了便于理解这些术语,我们先假设一个很常见的授权场景:
你访问了一个日志网站(third party application),你(client)觉得这个网站很不错,准备以后就要在这个网站上写日志了,所以你准备把QQ空间(Resource owner)里面的日志都导入进来。此日志网站想要导入你在QQ空间中的日志需要知道你的QQ用户名和密码才行,为了安全期间你不会把你的QQ用户名和密码直接输入在日志网站中,所以日志网站帮你导航到了QQ认证界面(Authorization Server),当你输入完用户名和密码后,QQ认证服务器返回给日志网站一个token, 该日志网站凭借此token来访问你在QQ空间中的日志。
- third party application 第三方的应用,想要的到Resource owner的授权
- client 代表用户
- Resource owner 资源拥有者,在这里代表QQ
- Authorization server 认证服务,这里代表QQ认证服务,Resource owner和Authorization server可以是不同的服务器,也可以是同一个服务器。
三、OAuth2.0中的四种模式
OAuth定义了四种模式,覆盖了所有的授权应用场景:
- 授权码模式(authorization code)
- 简化模式(implicit)
- 密码模式(resource owner password credentials)
- 客户端模式(client credentials)
前面我们假设的场景可以用前两种模式来实现,不同之处在于:
当日志网站(third party application)有服务端,使用模式1;
当日志网站(third party application)没有服务端,例如纯的js+html页面需要采用模式2;
本文主描述利用OAuth2.0实现自己的WebApi认证服务,前两种模式使用场景不符合我们的需求。
四、选择合适的OAuth模式打造自己的webApi认证服务
场景:你自己实现了一套webApi,想供自己的客户端调用,又想做认证。
这种场景下你应该选择模式3或者4,特别是当你的的客户端是js+html应该选择3,当你的客户端是移动端(ios应用之类)可以选择3,也可以选择4。
密码模式(resource owner password credentials)的流程:
这种模式的流程非常简单:
- 用户向客户端(third party application)提供用户名和密码。
- 客户端将用户名和密码发给认证服务器(Authorization server),向后者请求令牌(token)。
- 认证服务器确认无误后,向客户端提供访问令牌。
- 客户端持令牌(token)访问资源。
此时third party application代表我们自己的客户端,Authorization server和Resource owner代表我们自己的webApi服务。我们在日志网站的场景中提到:用户不能直接为日志网站(third party application)提供QQ(resource owner)的用户名和密码。而此时third party application、authorization server、resource owner都是一家人,Resource owner对third party application足够信任,所以我们才能采取这种模式来实现。
五、使用owin来实现密码模式
owin集成了OAuth2.0的实现,所以在webapi中使用owin来打造authorization无疑是最简单最方便的方案。
- 新建webApi项目
- 安装Nuget package:
Microsoft.AspNet.WebApi.Owin
Microsoft.Owin.Host.SystemWeb
- 增加owin的入口类:Startup.cs
在项目中新建一个类,命名为Startup.cs,这个类将作为owin的启动入口,添加下面的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[assembly:
OwinStartup( typeof (OAuthPractice.ProtectedApi.Startup))]
namespace OAuthPractice.ProtectedApi
{
public class Startup
{
public void Configuration(IAppBuilder
app)
{
var config
= new HttpConfiguration();
WebApiConfig.Register(config);
app.UseWebApi(config);
}
}
}
|
另外修改WebApiConfig.Register(HttpConfiguration config)方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public static class WebApiConfig
{
public static void Register(HttpConfiguration
config)
{
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name:
"DefaultApi" ,
routeTemplate:
"api/{controller}/{id}" ,
defaults:
new {
id = RouteParameter.Optional }
);
var jsonFormatter
= config.Formatters.OfType<JsonMediaTypeFormatter>().First();
jsonFormatter.SerializerSettings.ContractResolver
= new CamelCasePropertyNamesContractResolver();
}
}
|
最后两句话将会使用CamelCase命名法序列化webApi的返回结果。
3.使用ASP.NET Identity 实现一个简单的用户认证功能,以便我们生成用户名和密码
安装nuget package:
Microsoft.AspNet.Identity.Owin
Microsoft.AspNet.Identity.EntityFramework
4.新建一个Auth的文件夹,并添加AuthContext类:
1 2 3 4 5 6 7 |
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
copyright © 2008-2019 亿联网络 版权所有 备案号:粤ICP备14031511号-2
|