![](/img/trans.png)
[英]ASP.NET Identity External Providers Web API without cookies
[英]Is it possible to use an external Identity Provider in a Web API with ASP.NET 5?
閱讀此問題 ,@ Pinpoint的答案以及對評論的進一步討論后,我很清楚地知道,我們本身無法向使用ASP.NET 5開發的應用程序添加身份提供程序。然后,可以通過以下方式提供一種可能的替代方法:我在很多地方都發現過AspNet.Security.OpenIdConnect.Server。
現在,有一點我仍然不確定這一切,因為我確實不是安全專家,所以我對OAuth的了解不是很深。 我的懷疑是:使用OAuth保護一個RESTful API時可以使用外部身份提供程序嗎?
請注意,我並不是在向一個網站添加社交登錄,而是在一個RESTful API中使用一個外部身份提供程序。
我的意思是,這讓我有些困惑,因為我一直認為這應該是我的應用程序的關注點。
因此,我的問題是:使用OAuth和ASP.NET 5時,是否可以使用外部身份提供程序,而不是實現一個? 如果可能的話,簡而言之如何運作? 我的意思是,從某種意義上說,我的應用仍然需要能夠管理用戶的身份,因此它需要管理聲明等。
在那種情況下,如果確實可行,流程將如何? 外部身份提供者應該發行令牌嗎? 但是我的應用程序如何能夠驗證這些令牌並管理用戶身份?
編輯:我對此不確定的原因之一是,當我們使用UseOAuthAuthentication
擴展方法時,我們設置了一個回調路徑,其描述為
應用程序基本路徑中將返回用戶代理的請求路徑。 中間件在到達時將處理該請求。
現在,如果我們正在開發一個站點,那么這確實有意義。 該人去那里,單擊按鈕以登錄諸如Facebook之類的提供商。 用戶被重定向到Facebook的頁面,然后在登錄后,他被重定向到網站的某個頁面。
另一方面,使用RESTful API毫無意義。 沒有重定向的概念。
這似乎使得外部提供程序的使用僅用於站點,而不用於RESTful API。 這是我的問題的重點。
我的懷疑是:使用OAuth保護一個RESTful API時可以使用外部身份提供程序嗎?
是的,絕對有可能。 使用Azure Active Directory保護API終結點時,這就是您要做的事情:
app.UseOAuthBearerAuthentication(options => {
options.AutomaticAuthenticate = true;
options.Authority = "https://login.windows.net/tushartest.onmicrosoft.com";
options.Audience = "https://TusharTest.onmicrosoft.com/TodoListService-ManualJwt";
});
下一個合法的問題是:如果您可以使用AAD發行的令牌來保護您的API,那么為什么不對Facebook或Google令牌做同樣的事情?
與Facebook或Google不同,AAD發行名為JWT令牌的 完全標准化的令牌 ,OAuth2承載中間件可以對其進行“讀取”和“驗證”以確定該令牌是否仍然有效並且確實是為您的API發行的(即,是否附加了令牌的受眾)對應於您的API。您可以在發出授權請求時使用resource
參數控制此值)。
您無法使用FB或Google令牌執行類似操作,因為它們是完全不透明的。 實際上,這並不奇怪,因為這些令牌只有一個目標:允許您查詢FB或Google API,而不是自己的API(這些社交服務提供商不允許設置訪問令牌的受眾)。
由於您自己無法讀取令牌,因此唯一的選擇是詢問FB或Google是否仍然有效,以確保您的API不接受無效令牌。 這是您可以(輕松)使用Facebook的方法,因為它們提供了“令牌檢查終結點”,您可以查詢以下內容: https : //developers.facebook.com/docs/facebook-login/manually-build-a-login-flow (請參閱檢查訪問令牌一章)。 這樣,您可以確保令牌沒有過期,並確定與令牌相對應的用戶。
可悲的是,這種方法有兩個缺點:
您可以在此SO答案的最后部分找到更多信息(用於Katana和有關Dropbox的信息,但您應該了解一下): OWIN / OAuth2第三方登錄:來自客戶端應用程序的身份驗證,來自Web API的身份驗證
因此,我的問題是:使用OAuth和ASP.NET 5時,是否可以使用外部身份提供程序,而不是實現一個? 如果可能的話,簡而言之如何運作? 我的意思是,從某種意義上說,我的應用仍然需要能夠管理用戶的身份,因此它需要管理聲明等。
在那種情況下,如果確實可行,流程將如何? 外部身份提供者應該發行令牌嗎? 但是我的應用程序如何能夠驗證這些令牌並管理用戶身份?
為了解決上一部分中提到的限制,最好的選擇是-正如您已經知道的-創建自己的授權/身份驗證服務器。 這樣,您的API不會(直接)接受FB或Google令牌,而是由您自己的服務器發行的令牌,這些令牌可能會將您的用戶重定向到FB或Google進行身份驗證。
這正是此示例所做的: https : //github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Server/tree/vNext/samples/Mvc
客戶端應用程序(Mvc.Client)邀請該用戶向您的授權服務器(Mvc.Server)進行身份驗證,以便他可以獲取訪問令牌以稍后查詢API(也在Mvc.Server中)。 為此,將用戶重定向到您的授權服務器,該服務器本身可以為您提供Google或Twitter的身份驗證。
完成此外部身份驗證步驟后,用戶將被重定向回您的授權服務器(Mvc.Server),在該服務器上,系統要求他同意客戶端應用程序(Mvc.Client)訪問其個人數據。
征得同意后,用戶將使用可用於查詢API端點的訪問令牌重定向回客戶端應用程序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.