2013-02-28 95 views
1

我最近问this question并已成功设置我的自定义授权属性。针对操作和API调用的自定义授权?

但现在我已经打了另一堵墙关于API调用。我需要这些呼叫也以与动作呼叫相同的方式进行授权。我知道System.Web.Http和System.Web.Mvc Authorize属性有区别。所以我创建了一个单独的Api特定属性,它基本上做了同样的事情。但是,我在设置用户主体和标识时遇到了问题,就像我在原始属性中一样。

我的属性只是检查cookie中的一些值来授权请求​​,一旦属性读取了cookie,我将存储解密的cookie信息在自定义主体/标识设置中。在我的Api调用中,当我从标识中检索这些信息时,我的转换失败并且收到一个空值。

这是我如何存储的信息

阿比

HttpContext.Current.User = new MyPrinciple(new MyIdentity(decCookie.Name, decCookie.UserData)); 

行动

filterContext.RequestContext.HttpContext.User = new MyPrinciple(new MyIdentity(decCookie.Name, decCookie.UserData)); 

我如何找回我假定所需的信息是相同的

(User.principal.Identity as MyIdentity).MyData; 

问题

  1. 我真的需要有2个独立的属性
  2. 有关API的属性我怎么能轻易存储控制器内以后使用的信息。或者基本上我可以不用这种方式实际获取/设置身份这些电话?

编辑#1

我发现如何正确地从我ApiController访问我的cookie的值,我只是缺少的System.Web> _ <参考。所以第二个问题已经解决了!但#1仍然存在。

回答

1

你只能从c#中的一个类继承,并且每个authorize属性都存在于它自己的命名空间中,所以你不能在一个类中完成它。

你可以把它放在一个通用的命名空间中,然后调用一个普通的类来完成提升。

可能的解决方法(未经测试)

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using System.Web.Security; 

namespace Common.Attributes 
{ 
public class CustomAuthorize : System.Web.Mvc.AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     base.OnAuthorization(filterContext); 

     if (!HttpContext.Current.Request.IsAuthenticated || (HttpContext.Current.User as User) != null) 
      return; 

     filterContext.HttpContext.User = Authorize.ExtractIdentity(filterContext.HttpContext); 
    } 
} 

public class CustomHttpAuthorize : System.Web.Http.AuthorizeAttribute 
{ 
    public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext) 
    { 
     base.OnAuthorization(actionContext); 

     if (!HttpContext.Current.Request.IsAuthenticated || (HttpContext.Current.User as User) != null) 
      return; 

      System.Threading.Thread.CurrentPrincipal = Authorize.ExtractIdentity(filterContext.HttpContext); 
     } 
    } 
} 

public static class Authorize 
{ 
    public static IIdentity ExtractIdentity(HttpContext context) 
    { 
     // do your magic here 
    } 
} 
} 
+0

我看你已经设置System.Threading.Thread.CurrentPrincipal ...这如何从HttpContext.Current.User有什么不同? – Zholen 2013-03-01 18:53:39

+0

我没有看过它tbh,我发现api控制器的用户对象与httpcontext.user不同,所以我将它推入到线程主体中,而它似乎工作正常。 – Slicksim 2013-03-03 17:21:14

3

Web API和MVC没有任何共同之处(技术上) - 即使它们看起来相同。你需要两个独立的属性。