欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

源于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);
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
在此要感谢罗总的大力支持!