Asp.net WEBAPI 简单的OAUTH认证

原创 2016年08月29日 14:53:20

最近想买需要,公司使用了完全的前后端分离技术,后端使用ASP.NET WEBAPI实现,前端使用PHP作为中转服务器调用后端服务器提供的WEBAPI,前期测试环境没有加OAUTH 安全认证,但是实际的生产环境肯定要认证,不然暴露出去的WEB API就会很危险,很容易被别人利用来生成脏数据,所以经过仔细思考,前期暂时先使用认证指定IP的方式来防止异常注入操作,整体操作思路比较简单:1. 创建授权过滤器类【这是过滤的入口动作,主要负责连接用户请求和授权验证方法】。2. 创建授权验证方法,这里面是认证的核心内容,可以自定义认证规则,比如想复杂一点的可以加入Token认证什么的。3. 将过滤规则注册到全局过滤器中。 经过上面三步,就大功告成,只接受指定服务器IP的访问请求,其它的访问会被过滤拒绝掉,这样安全性就高了很多!
具体操作如下:
1.新建授权过滤器类APIAuthorizeAttribute.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Security.Principal;
using System.Text;
using System.Threading;
using System.Web;
using System.Web.Http.Filters;
using Uuch.HP.WebAPI.Helper;
namespace Uuch.HP.WebAPI.Filter
{
  public class APIAuthorizeAttribute : AuthorizationFilterAttribute
  {
    public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
      //如果用户使用了forms authentication,就不必在做basic authentication了
      if (Thread.CurrentPrincipal.Identity.IsAuthenticated)
      {
        return;
      }
      var authHeader = actionContext.Request.Headers.Authorization;
      if (authHeader != null)
      {
        if (authHeader.Scheme.Equals("basic", StringComparison.OrdinalIgnoreCase) &&
          !String.IsNullOrWhiteSpace(authHeader.Parameter))
        {
          var credArray = GetCredentials(authHeader);
          var userName = credArray[0];
          var key = credArray[1];
          string ip = System.Web.HttpContext.Current.Request.UserHostAddress;
          //if (IsResourceOwner(userName, actionContext))
          //{
            //You can use Websecurity or asp.net memebrship provider to login, for
            //for he sake of keeping example simple, we used out own login functionality
          if (APIAuthorizeInfoValidate.ValidateApi(userName,key,ip))//Uuch.HPKjy.Core.Customs.APIAuthorizeInfo.GetModel(userName, key, ip) != null
            {
              var currentPrincipal = new GenericPrincipal(new GenericIdentity(userName), null);
              Thread.CurrentPrincipal = currentPrincipal;
              return;
            }
           //}
        }
      }
      HandleUnauthorizedRequest(actionContext);
    }
    private string[] GetCredentials(System.Net.Http.Headers.AuthenticationHeaderValue authHeader)
    {
      //Base 64 encoded string
      var rawCred = authHeader.Parameter;
      var encoding = Encoding.GetEncoding("iso-8859-1");
      var cred = encoding.GetString(Convert.FromBase64String(rawCred));
      var credArray = cred.Split(':');
      return credArray;
    }
    private bool IsResourceOwner(string userName, System.Web.Http.Controllers.HttpActionContext actionContext)
    {
      var routeData = actionContext.Request.GetRouteData();
      var resourceUserName = routeData.Values["userName"] as string;
      if (resourceUserName == userName)
      {
        return true;
      }
      return false;
    }
    private void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
      actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized);
      actionContext.Response.Headers.Add("WWW-Authenticate",
                         "Basic Scheme='eLearning' location='http://localhost:8323/APITest'");
    }
  }
}
  1. 添加验证方法类APIAuthorizeInfoValidate.cs
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace Uuch.HP.WebAPI.Helper
{
  public class APIAuthorizeInfo
  {
    public string UserName { get; set; }
    public string Key { get; set; }
  }
  public class APIAuthorizeInfoValidate
  {
    public static bool ValidateApi(string username, string key, string ip)
    {
      var _APIAuthorizeInfo = JsonConvert.DeserializeObject <List<APIAuthorizeInfo>>(WebConfigHelper.ApiAuthorize);
      var ips = WebConfigHelper.IPs.Contains(",") ? WebConfigHelper.IPs.Split(',') : new string[] { WebConfigHelper.IPs };
      if (_APIAuthorizeInfo != null && _APIAuthorizeInfo.Count > 0)
      {
        foreach (var v in _APIAuthorizeInfo)
        {
          if (v.UserName == username && v.Key == key && ips.Contains(ip))
          {
            return true;
          }
        }
      }
      return false;
    }
  }
}

3、把添加到全局过滤器中,这里要注意了,不要添加到FilterConfig.cs,而要添加到WebApiConfig.cs,因为FilterConfig是MVC用的,我们这里是WebAPI。

public static class WebApiConfig
{
  public static void Register(HttpConfiguration config)
  {
    config.Routes.MapHttpRoute(
      name: "DefaultApi",
      routeTemplate: "api/{controller}/{id}",
      defaults: new { id = RouteParameter.Optional }
    );
    config.Filters.Add(new APIAuthorizeAttribute());
  }
}
版权声明:大道至简,悟在天成。本文为博主原创文章,未经博主允许不得转载。http://blog.csdn.net/fwj380891124

相关文章推荐

在WebApi中基于Owin OAuth使用授权发放Token

转自:http://www.tuicool.com/articles/Ene2uaj 如何基于Microsoft.Owin.Security.OAuth,使用Client Cre...

自己开发实现OAuth做webapi认证

一、作为认证服务器,首先需要提供一个可以通过appid/appsecret来获取token这样的一个接口,于是便有了以下代码。 public class AuthController ...

ASP.NET WEBAPI 的身份验证和授权

身份验证(Authentication):确定用户是谁。 授权(Authorization):确定用户能做什么,不能做什么。 身份验证 WebApi 假定身份验证发生在宿主程序称中。...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

WebApi实现验证授权Token,WebApi生成文档等

using System; using System.Linq; using System.Web; using System.Web.Http; using System.Web.Security;...

使用OAuth打造webapi认证服务供自己的客户端使用

一、什么是OAuth OAuth是一个关于授权(Authorization)的开放网络标准,目前的版本是2.0版。注意是Authorization(授权),而不是Authentication(认证)...

C#搭建Oauth2.0认证流程以及代码示例

我认为对于一个普遍问题,必有对应的一个简洁优美的解决方案。当然这也许只是我的一厢情愿,因为根据宇宙法则,所有事物总归趋于混沌,而OAuth协议就是混沌中的产物,不管是1.0、1.0a还是2.0,单看版...
  • for12
  • for12
  • 2015年09月10日 15:22
  • 6506

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

ASP.NET Web API使用示例

上篇博客讲解rest服务开发时,曾经提到过asp.net mvc中的rest api,由于篇幅原因,没有在上篇博客中进行讲解,这里专门拿出来进行讨论。还是一样引用上次的案例,用asp.net 提供的w...

ASP.NET Web API:安全验证之使用HTTP基本认证

原地址:http://www.cnblogs.com/parry/archive/2012/11/09/ASPNET_MVC_Web_API_HTTP_Basic_Authorize.html#270...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Asp.net WEBAPI 简单的OAUTH认证
举报原因:
原因补充:

(最多只允许输入30个字)