源于nopcommerce的WebApi认证机制 博客分类: MVC4WebAPI
程序员文章站
2024-02-04 23:44:52
...
写在前面:
该机制的目的在于验证请求的合法性并对每次请求的数据进行加密,预防重放攻击。
每步请求都要求在header中添加一个固定的头部
key:Authorization
value:HMACSHA256+空格+加密后的验证串
api收到请求后就会获取特定的头部,然后进行拆分,获取参数并分析是否为正确的请求,如果OK,则继续往下进行,如果错误,则提醒非法的访问。
加密串的组成:第一部分加密的AppID,第二部分时间搓,第三部分由AppID和时间搓组成的加密串加密方式可以自己定义
时间搓可用来确定是否为重放攻击。
需要用到的引用
Microsoft.Owin.Security.OAuth
Microsoft.Owin.Security
Microsoft.Owin
Microsoft.AspNet.Identity.EntityFramework
Microsoft.AspNet.Identity.Owin
Microsoft.Owin.Host.SystemWeb (我被它坑了好久)【不安装这个,系统无法识别新的Startup启动类】
下面简单介绍步骤
1、新建一个webapi项目
2、注释掉原有的Global.asax文件中,启动项目
3、新建StartUp启动项,并将Global.asax里面的启动内容,拷贝过来,在程序入口处增加
OwinConfig.Configure(app);
4、App_start文件夹中,新增OwinConfig文件
5、在webapi项目中新增Security文件加,然后把示例代码中的文件按顺序添加进去
6、为了方便演示在LoadApiAccount方法中,我把参数写死了,具体使用时可替换
源码示例地址:http://pan.baidu.com/s/1dFN8eM9
在此要感谢罗总的大力支持!
该机制的目的在于验证请求的合法性并对每次请求的数据进行加密,预防重放攻击。
每步请求都要求在header中添加一个固定的头部
key:Authorization
value:HMACSHA256+空格+加密后的验证串
api收到请求后就会获取特定的头部,然后进行拆分,获取参数并分析是否为正确的请求,如果OK,则继续往下进行,如果错误,则提醒非法的访问。
加密串的组成:第一部分加密的AppID,第二部分时间搓,第三部分由AppID和时间搓组成的加密串加密方式可以自己定义
时间搓可用来确定是否为重放攻击。
需要用到的引用
Microsoft.Owin.Security.OAuth
Microsoft.Owin.Security
Microsoft.Owin
Microsoft.AspNet.Identity.EntityFramework
Microsoft.AspNet.Identity.Owin
Microsoft.Owin.Host.SystemWeb (我被它坑了好久)【不安装这个,系统无法识别新的Startup启动类】
下面简单介绍步骤
1、新建一个webapi项目
2、注释掉原有的Global.asax文件中,启动项目
3、新建StartUp启动项,并将Global.asax里面的启动内容,拷贝过来,在程序入口处增加
OwinConfig.Configure(app);
public class Startup { public void Configuration(IAppBuilder app) { OwinConfig.Configure(app); AreaRegistration.RegisterAllAreas(); GlobalConfiguration.Configure(WebApiConfig.Register); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); } }
4、App_start文件夹中,新增OwinConfig文件
public class OwinConfig { public static void Configure(IAppBuilder app) { app.CreatePerOwinContext(ApplicationDbContext.Create); app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create); bool HmacEnabled = false; //从配置文件中获取是否开启验证的配置 bool.TryParse(ConfigurationManager.AppSettings["Authentication:Hmac.Enabled"], out HmacEnabled); if (HmacEnabled) //如果为true,表示开启验证 { var authenticationOptions = new AuthenticationOptions(); authenticationOptions.HmacEnabled = HmacEnabled; //初始化AuthInfo的表记录值 var apiAccountProvider = new ApiAccountProvider(); if (authenticationOptions.HmacEnabled) { //默认请求失效时间0分钟 int HmacSignatureValidityPeriod = 0; //从配置文件中获取失效时间 int.TryParse(ConfigurationManager.AppSettings["Authentication:Hmac.SignatureValidityPeriod"], out HmacSignatureValidityPeriod); //将配置值赋值给authenticationOptions的失效时间参数 authenticationOptions.HmacSignatureValidityPeriod = TimeSpan.FromMinutes(HmacSignatureValidityPeriod); // app.UseHmacAuthentication(new HmacAuthenticationOptions { ApiCredentialsProvider = apiAccountProvider, SignatureValidityPeriod = authenticationOptions.HmacSignatureValidityPeriod }); } } } }
5、在webapi项目中新增Security文件加,然后把示例代码中的文件按顺序添加进去
6、为了方便演示在LoadApiAccount方法中,我把参数写死了,具体使用时可替换
源码示例地址:http://pan.baidu.com/s/1dFN8eM9
在此要感谢罗总的大力支持!