源于nopcommerce的WebApi认证机制

写在前面:
该机制的目的在于验证请求的合法性并对每次请求的数据进行加密,预防重放攻击。
每步请求都要求在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
在此要感谢罗总的大力支持!

猜你喜欢

转载自yh-fly.iteye.com/blog/2380964