2014-01-17 48 views
1

我在理解與幾個項目一起使用它的概念時遇到了問題。假設我有4個項目在不同的項目中瞭解和使用IPrincipal

  • Business.Services
  • Presentation.MVC
  • Presentation.WebApi

Business.Services是所有的業務邏輯和數據庫連接進行該項目。 MVC,Web API項目引用服務來調用業務邏輯。 MVC和web api沒有任何交互,因爲它們完全是爲了不同的目的在我的情況。 Web Api僅代表處理移動客戶端請求/響應。

在我的MVC項目中,我爲用戶提供了登錄信息,並且在成功登錄後,我創建了FormsAuthenticationTicket,並且藉助此故障單執行了自定義授權,如果用戶可用於指定的操作。除此之外,我還根據授權中的我的FormsAuthenticationTicket數據創建IPrincipal。設置後,我可以達到它像HttpContext.Current.User

另一方面,在我的Web Api項目中,所有請求都需要基本身份驗證。有一個登錄操作,用戶需要發送LoginName和Password以獲取將用於未來請求的令牌。一旦客戶端檢索到令牌,客戶端會在查詢字符串的末尾添加?token參數。當請求到達Web Api時,它會進入我的CustomAuthorizationAttribute並再次檢查用戶是否有資格獲得該請求。此外,我將Thread.CurrentPrincipalHttpContext.Current.User設置爲由標記確定的IPrincipal對象。

這些現在是非常好的。問題從這裏開始。我想把SignalR放到我的Presentation.WebApi項目中。據我所知,OWIN是所有MVC,WebApi的頂層,因此,如果我們已經有一個,我們不需要擁有認證系統。所以第一個問題是:我如何通過這個信號器創建授權?我得到的Context.User(IPrincipal)自然爲空。這似乎確定,因爲在我的web api中,IPrincipal對象是通過CustomAuthorizationAttrbute中的每個請求設置的。此外,我如何授權來自Presentation.MVC的用戶?我應該爲mvc用戶提供一種爲他提供令牌的新方法嗎?我可以使用它的FormsAuthenticationTicket數據來授權嗎?

回答

0

據我的理解,所有的應用程序託管在同一主機(IIS,我假設)。如果是這樣,請從您的應用程序中移出任何驗證代碼,並在OWIN中間件級別啓用它。作爲NuGet包裹的Cookie based authentication is already provided by the ASP.NET團隊:Microsoft.Owin.Security.Cookies

一旦您擁有此身份驗證層,您可以在提供的AuthorizeAttribute(因爲每個Web框架都有其自己的AuthorizeAttribute)與這些名稱空間一起使用時在每個應用程序中擁有不同級別的授權。這應該適用於ASP.NET MVC和SignalR端點。另外請注意,對於SignalR客戶端,您應該通過Cookie或查詢字符串發送認證tiket /令牌,因爲headers don't play well with web sockets

您還希望爲ASP.NET Web API應用程序使用基於標記的身份驗證。不知道什麼樣的'標記'是,但你提到基本身份驗證(這不是一個基於令牌的身份驗證,但我想你已經知道了)。在這種情況下,您可以爲您的ASP.NET Web API應用程序提供特定的基本身份驗證中間件。 Katana項目實際上有一個BasicAuthenticationMiddleware實施,但它從未發佈。如果您想編寫自己的身份驗證中間件,可以查看Pablo M. Cibraro(又名Cibrax)的「Writing an AuthenticationHandler for Katana」。

+0

在這種情況下,我必須刪除基本認證才能訪問SignalR權利?因爲WebAPI需要IIS web api上託管的基本身份驗證和信號發送器。問題是我沒有在WebAPI上使用基於cookie的身份驗證,我創建了由Login操作生成的自定義令牌,並使用它來授權web api中的其他方法。問題是我永遠無法獲得任何級別的令牌檢查:S – kkocabiyik

相關問題