2

我在OAuth和OpenIDConnect以及aspnet核心中間件中迷失了方向。任何幫助,將不勝感激。使用Google OAuth在aspnet核心中保護web服務

我有多個使用相同Web服務集的UI(Web,本機應用程序),我想確保只有經過身份驗證的用戶才能訪問Web服務。我的組織使用Google帳戶,因此我想使用限於組織域的Google身份驗證。

該網站正在要求認證,繼this sample。我現在需要的是讓網站(AngularJS 4)用我可以通過Google驗證的身份驗證令牌來調用我的後端Web服務。

後端服務使用aspnet核心編寫。我嘗試過使用這些方法:Google middlewareGoogle OpenIDConnect,但這些仍然1)假設有一個用戶界面可以提示未經授權的用戶登錄,2)似乎是基於cookie的,並且我不會爲Web服務調用。

我不想提示用戶登錄,因爲本例中的「用戶」是軟件客戶端。要麼他們已經通過身份驗證,要麼沒有。我只需要獲取認證令牌,驗證它,然後繼續。

This appears to be the same question,它還沒有被回答。

任何建議表示讚賞。此外,關於讓原生應用程序也一樣的建議或提示!

回答

3

得到它的工作。如前所述,我迷路了,OpenIDConnect作爲一種解決方案雖然在幾個領域被引用,但卻是Web服務的一個鯡魚。這裏是爲我工作現在,隨着作爲完整的步驟,我可以提供(一些清理工作需要):

  1. 添加認證的UI following these directions
  2. 獲取JWT令牌as shown in the first segment here
  3. 在每個Web服務調用,包括在報頭中的JWT令牌:

    名稱:認證

    值:承載{令牌值}

  4. 安裝JwtBearer NuGet package

  5. 在Web服務啓動的ConfigureServices方法,以後你AddMvc():

    services.AddAuthorization(options => 
    { // this policy needed only if you want to restrict to accounts within your domain. otherwise, don't use options. or use whatever options work for you. 
         options.AddPolicy("hd", 
          policy => policy.RequireAssertion(context => 
           context.User.HasClaim(c => 
            c.Type == "hd" && 
            ("https://accounts.google.com".Equals(c.Issuer) || 
            "accounts.google.com".Equals(c.Issuer, StringComparison.CurrentCultureIgnoreCase)) && 
            c.Value == "yourdomain.com" 
           ))); 
    }); 
    
  6. 在配置方法,在你面前UseMvc():

     JwtBearerOptions jwtOptions = new JwtBearerOptions(); 
         jwtOptions.Audience = "{the OAuth 2.0 client ID credential from google api developer console}"; 
         jwtOptions.Authority = "https://accounts.google.com"; 
         jwtOptions.TokenValidationParameters = new TokenValidationParameters(); 
         jwtOptions.TokenValidationParameters.ValidIssuers = new List<string>() 
         { 
          "https://accounts.google.com", 
          "accounts.google.com" 
         }; 
    
         app.UseJwtBearerAuthentication(jwtOptions); 
    

也許有更合適的方法來做到這一點......如果有,我是interes試過了。現在,這是行得通的。

0

我會盡力幫忙。

首先,您需要查看OpenID Connect(建立在OAuth 2.0之上),記住OAuth 2.0 NOT an Authentication protocol

1)假設有一個UI 假設您使用的是Google服務,則無需UI即可登錄。您只需檢查存在的並驗證訪問令牌,身份令牌(也許刷新令牌)。如果沒有令牌,則假定用戶未經過認證,並使用授權請求將其重定向到認證服務器。

如果有一個有效的訪問令牌和刷新令牌,那麼您可以假設該用戶已通過身份驗證。

您也可以檢查訪問令牌的適當「範圍」,以確定它們是否授權您的特定應用程序。

如果您使用Google for Authorization Server,您可以在Identity Token中使用validate the the hd parameter具有所需的域。

BTW:沒有涉及餅乾。

希望有所幫助。

+0

謝謝,我明白了概念和流程(我認爲)。我遇到的問題是迄今爲止我發現的所有中間件都假設您將使用用戶界面進行登錄。我還沒有找到任何示例或文檔說明如何讓客戶端已經*已經登錄*發送通過Web服務調用在服務器端驗證正確的令牌*。我想使用控制器上的[Authorize]屬性,並讓正確的中間件使用Google驗證相應的令牌。我是否必須編寫自己的中間件來做到這一點,還是已經存在? – Celeste

+0

我想我不明白。 OAuth和OIDC中有4名玩家。資源所有者(用戶)和OAuth客戶端(應用程序),OIDC提供程序(在您的示例中爲Google)和資源服務器(其中包含受保護的資源)。當你說「你已經登錄的客戶端」這是你指的?通常,OAuth客戶端需要對返回的令牌執行驗證,以確保它們未被篡改,並且確實已從適當的OIDC提供者返回,而不是某些中間人。有許多庫應該用於此目的。 – jwilleke

+0

感謝您對我的耐心等待。讓我看看我能否澄清:我有2個OAuth客戶端:Web UI和Web服務。這些不是同一過程的一部分;他們在不同的服務器上運行。 Web UI可以使用Google JavaScript庫瀏覽整個OAuth流程。一旦完成,用戶應該能夠使用Web UI,Web UI反過來調用各種Web服務。因此,UI已經獲得了某種應該包含在Web服務調用中的令牌,並且Web服務應該驗證該令牌。 – Celeste