2013-02-28 66 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沒有任何共同之處(技術上) - 即使它們看起來相同。你需要兩個獨立的屬性。