2015-02-23 142 views
2

我有一個MVC應用程序。它還使用Web API控制器公開的服務。Web API控制器和MVC控制器 - 身份驗證

對於MVC和Web API的託管環境都是IIS。 在IIS身份驗證模式下設置爲匿名。

HttpModule用於將用戶的標識和角色設置爲Thread和HttpContext對象。

做所有的MVC控制器被正確調用,但Web API控制器返回401未經授權的錯誤。

在兩個控制器中都使用適當的授權屬性。

下面是用戶將用戶設置爲線程和上下文對象的代碼。

var principal = new GenericPrincipal(new GenericIdentity(userName), roles); 
       // contextBase.User = principal; 
       HttpContext.Current.User = principal; 
       Thread.CurrentPrincipal = principal; 

回答

5

Web Api是基於REST的。其中,REST是無狀態的,這意味着沒有會話的概念。 MVC中的身份驗證通過會話進行處理,因此,在應用程序的MVC側進行簡單身份驗證對於Web Api方面沒有任何作用。

每個Web Api請求都必須具有完成該請求所需的所有信息,其中包括任何適用的認證/授權。通常使用API​​,這是通過在請求頭中傳遞身份驗證令牌來處理的,但有許多方法可以授權API請求。我建議只需searching for something like "web api authentication"並閱讀一下。

多空是授權網頁API端點需要從你的MVC網站認證不同的和獨立的過程。

+0

你是說我需要對WEB API控制器有不同的身份驗證機制嗎? – Sam 2015-02-23 20:46:25

+0

不正確。在ASP.NET中,「會話」與「身份驗證」是分開的,這樣您就可以啓用另一個,但它們都是基於會話的,一般意義上(這就是我的意思)。即便如此,並非所有的MVC認證都是基於認證的形式。 MVC 5默認使用Identity,它完全獨立並且與表單驗證平行。 Cookie是否涉及也是一個單獨的概念,並且可以自行配置(儘管此時不推薦使用無Cookie會話/身份驗證)。 – 2015-02-23 20:51:25

+0

@Sam:是的。這正是我所說的。他們可以均引用同一個用戶的持久性存儲,甚至使用相同的基礎架構(身份,在最新的公開版本),但與你的MVC網站進行身份驗證有沒有任何影響您的認證狀態與您的網絡API,反之亦然。他們使用完全不同的方法來確定請求「授權」與否。 – 2015-02-23 20:53:36