簡體   English   中英

是否可以在帶有ASP.NET 5的Web API中使用外部身份提供程序?

[英]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 (請參閱檢查訪問令牌一章)。 這樣,您可以確保令牌沒有過期,並確定與令牌相對應的用戶。

可悲的是,這種方法有兩個缺點:

  • 您必須對Facebook端點進行額外的HTTP調用以驗證訪問令牌,這意味着將接收到的令牌緩存起來,以避免過多的請求淹沒Facebook。
  • 由於不是為您自己的API發行訪問令牌,因此您必須絕對確保將訪問令牌發行給您完全信任的客戶端應用程序 ,否則它將允許任何第三方開發人員將自己的FB / Google令牌與您的API一起使用必須征得用戶同意。 顯然,這是一個主要的安全問題。

您可以在此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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM