using System;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Web;
using System.Web.Http;
using System.Web.Http.Controllers;
using System.Web.Http.Filters;
using System.Web.Security;
namespace ShadowEditor.Server.Base
{
///
/// ApiController权限验证属性
///
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class ApiAuth : ActionFilterAttribute
{
///
/// 权限验证
///
///
public override void OnActionExecuting(HttpActionContext actionContext)
{
try
{
// 允许匿名访问
if (actionContext.ActionDescriptor.GetCustomAttributes().Count > 0)
{
base.OnActionExecuting(actionContext);
return;
}
// 获取cookie
var cookie = actionContext.Request.Headers.GetCookies();
if (cookie == null || cookie.Count < 1)
{
DenyAction(actionContext, 301, "登录超时!");
return;
}
// 获取票据
FormsAuthenticationTicket ticket = null;
foreach (var perCookie in cookie[0].Cookies)
{
if (perCookie.Name == FormsAuthentication.FormsCookieName)
{
ticket = FormsAuthentication.Decrypt(perCookie.Value);
break;
}
}
// 验证票据
if (ticket == null)
{
DenyAction(actionContext, 300, "无权限!");
return;
}
// 验证权限后将获得的用户信息写入Session
HttpContext.Current.Items.Add("__userID", ticket.UserData); // 获取登陆时写入cookie的用户ID
base.OnActionExecuting(actionContext);
}
catch
{
DenyAction(actionContext, 300, "权限验证出错!");
}
}
///
/// 处理拒绝访问
///
/// 上下文环境
/// 状态码(300-执行出错,301-登录超时)
/// 说明
private void DenyAction(HttpActionContext context, int code, string msg)
{
//context.Response.StatusCode = HttpStatusCode.OK;
//var content = JsonHelper.ToJson(new Model.Result
//{
// Code = code,
// Msg = msg
//});
//context.Response.Content = new StringContent(content, Encoding.UTF8, "application/json");
}
}
}