authentication - 在Asp.Net核心Web應用程序中使用EasyAuth對Azure App Service上的AAD進行身份驗證時,無法填充ClaimsPrincipal




asp.net-core azure-web-sites (4)

我們有一個基於Asp.Net核心的Web應用程序。 它不包含任何配置的身份驗證中間件。

我們託管Azure App Service並使用身份驗證/授權選項(EasyAuth)對Azure AD進行身份驗證。

身份驗證效果很好 - 我們插入了必需的標頭,我們可以在/.auth/me上看到經過身份驗證的身份。 但是HttpContext.User屬性不會被填充。

這是Asp.Net核心的兼容性問題嗎? 或者我做錯了什麼?


以下代碼從Azure App Service HTTP標頭解密AAD標記,並使用聲明填充HttpContext.User。 這很粗糙,因為你想要緩存配置而不是在每個請求上查找它:

    OpenIdConnectConfigurationRetriever r = new OpenIdConnectConfigurationRetriever();
    ConfigurationManager<OpenIdConnectConfiguration> configManager = new ConfigurationManager<OpenIdConnectConfiguration>(options.Endpoint, r);
    OpenIdConnectConfiguration config = await configManager.GetConfigurationAsync();

    var tokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuerSigningKey = true,
        IssuerSigningKeys = config.SigningKeys.ToList(),
        ValidateIssuer = true,
        ValidIssuer = config.Issuer,
        ValidateAudience = true,
        ValidAudience = options.Audience,
        ValidateLifetime = true,
        ClockSkew = new TimeSpan(0, 0, 10)
    };

    JwtSecurityTokenHandler handler = new JwtSecurityTokenHandler();

    ClaimsPrincipal principal = null;
    SecurityToken validToken = null;

    string token = context.Request.Headers["X-MS-TOKEN-AAD-ID-TOKEN"];

    if (!String.IsNullOrWhiteSpace(token))
    {
        principal = handler.ValidateToken(token, tokenValidationParameters, out validToken);

        var validJwt = validToken as JwtSecurityToken;

        if (validJwt == null) { throw new ArgumentException("Invalid JWT"); }

        if (principal != null)
        {
            context.User.AddIdentities(principal.Identities);
        }
    }

它僅適用於Azure AD。 要支持其他ID提供商(Facebook,Twitter等),您必須檢測相關標頭並找出如何解析每個提供商的令牌。 但是,它應該只是上述主題的變體。


您可以嘗試使用此庫。 我遇到了類似的問題並創建了這個以簡化使用。

https://github.com/dasiths/NEasyAuthMiddleware

用於ASP.NET CORE的Azure應用服務身份驗證(EasyAuth)中間件,具有完全可自定義的組件,支持本地調試

它通過註冊自定義身份驗證處理程序來保護HttpContext.User。 為了在本地運行時更容易,它甚至可以使用json文件來加載模擬聲明。


我寫了一個小的基本中間件來做到這一點。 它將基於.auth / me端點創建一個標識。 身份在身份驗證管道中創建,以便[authorize]屬性和策略與身份一起使用。

你可以在這裡找到它:

https://github.com/lpunderscore/azureappservice-authentication-middleware

或者在nuget上:

https://www.nuget.org/packages/AzureAppserviceAuthenticationMiddleware/

添加後,只需將此行添加到您的啟動中:

app.UseAzureAppServiceAuthentication();


是的,這是一個兼容性問題。 不幸的是,ASP.NET Core不支持從IIS模塊(如Easy Auth)流向身份信息到應用程序代碼。 這意味著HttpContext.User和類似的代碼將不像常規ASP.NET那樣工作。

現在的解決方法是從服務器代碼調用Web應用程序的/.auth/me端點以獲取用戶聲明。 然後,您可以使用x-ms-client-principal-id請求標頭值作為緩存密鑰,根據需要緩存此數據。 /.auth/me調用需要進行適當的身份驗證,方法與調用Web應用程序需要進行身份驗證的方式相同(auth cookie或請求標頭令牌)。





azure-active-directory