2017-11-18 184 views
0

我想使用Microsoft帳戶作爲IdentityServer4中的外部登錄,我在Microsoft應用程序門戶下創建了一個新應用程序並將其配置爲以下:IdentityServer4 - 爲輸入參數'範圍'提供的值無效。範圍https://graph.microsoft.com/user.read電子郵件是無效的

  1. 我在委託權限添加新的網絡平臺
  2. 我添加了以下權限
    • User.Read
    • 電子郵件
    • 的OpenID
    • 簡介

,這裏是我使用的IdentityServer4通過添加電子郵件作爲一個範圍來訪問Microsoft帳戶代碼:

services.AddAuthentication() 
    .AddMicrosoftAccount("MicrosoftAccount", options => 
    { 
     options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme; 

     options.ClientId = "ClientId"; 
     options.ClientSecret = "ClientSecret"; 
     options.Scope.Add("email"); 

}); 

但在嘗試訪問Microsoft帳戶我的時候出現以下錯誤

輸入參數'scope'的提供值無效。範圍https://graph.microsoft.com/user.read電子郵件無效

回答

1

使用OpenID Connect時,必須始終在請求的範圍列表中包含openid。爲了完整起見,這裏的工作設置:

options.Scope.Add("openid"); 
options.Scope.Add("email"); 

這是微軟here記載:

如果一個應用程序進行登入使用OpenID的連接,它必須要求OpenID的範圍。

它實際上只是OpenID的spec的一部分:

ID連接請求必須包含的OpenID的範圍值。如果openid範圍值不存在,則行爲完全未指定。其他範圍值可以存在。應用程序無法理解的範圍值應該被忽略。

默認情況下,ASP.NET核心only sets the user.read scope中的Microsoft帳戶實現,這就是爲什麼您需要自己添加它。看起來,ASP.NET Core 中的Google實現默認爲include the openid scope,這就解釋了爲什麼您可能會看到不同提供者的不同結果。

鑑於您已將profile範圍添加到「委託權限」列表中,您可能還想將其包含在請求的範圍列表中。

這解釋了您的錯誤原因,但更簡單的方法可能是僅將請求的範圍列表完全保留(僅使用user.read的默認值)。在我的例子中這樣做,我仍然在我的例子中得到相同的索賠列表,它由nameidentifier,name,givenname,surnameemailaddress組成。這可以解釋爲什麼默認情況下不請求OpenID特定範圍。