簡體   English   中英

Microsoft“身份平台”是否(輕松)與“(ASP.NET)身份框架”集成 - MVC5 和 .NET 4.7.2?

[英]Does Microsoft 'Identity Platform' (easily) integrate with the '(ASP.NET) Identity Framework' - MVC5 & .NET 4.7.2?

我們有一個 .NET 4.7.2 MVC5 應用程序,它使用 EF 添加到 Microsoft Identity Framework 的使用中,並且想知道它是否容易組合 - 以某種方式,MSAL.NET/Identity Platform?

例如,理想情況下,保留用於本地登錄的身份框架,並使用用於 Azure AD 和 Azure AD B2C(外部身份/用戶)登錄的身份平台 OAuth v2 集成對其進行補充?

  • 這受支持嗎?
  • 有重大問題嗎?
  • 是否容易插拔?
  • 最好的路線是什么?

我似乎無法在任何地方找到答案。

更新:忽略需要 .NET Core 3.1 或 Android 的特定版本 (#27) 的演示(- 當“Android SDK 管理器”工具無法正常工作時,因為它試圖修改正在枚舉過程中的枚舉:( ) 我設法對 ASP.NET 的“快速啟動”應用程序進行了一些更改以使其正常工作,但是當我嘗試通過將我們現有應用程序中的 (ASP.NET) 身份框架代碼的位替換為來自快速入門示例的身份平台代碼,我似乎陷入了即時登錄圈。

這可能不是最好的答案,但為了他人的利益,這就是我所學到的,並且是我個人的想法。

目前,似乎沒有明確/輔助的過渡路徑。

但是,我確實找到了一種手動從一個過渡到另一個的方法(-“(ASP.NET)身份框架”到“身份平台”/Azure AD B2C/MSAL),這也給我留下了以下結論:

而不是對不同 IdP/AS(身份提供者/身份驗證服務器)供應商的 OID-C/OIDC(OpenID 連接)和/或 OAuth 管道提供固有支持——可能他們所有的管道都可能在另一個/彼此之間絆倒(作為一部分更固有的接線),並且還必須在添加新的 IdP/AS 供應商時重新測試所有供應商的整個應用程序,我認為最好的方法是將供應商的 id-token 轉換為我們的自己的訪問令牌,或者更直接地說,我們現有的 ClaimsPrincipal。

因此,就解決方案的一些機制而言; 添加了以下 NuGet package (及其基礎依賴項):

    <package id="Microsoft.IdentityModel.Protocols.OpenIdConnect" version="6.7.1" targetFramework="net472" />

(...雖然版本“6.8.0”現在可用。)

然后我可以使用如下代碼來驗證“id_token”,它又返回一個“ClaimsPrincipal”; 然后我可以使用“電子郵件”聲明的值來檢查我們系統中的現有用戶 - 如果沒有,則創建一個新用戶(使用隨機和安全的密碼以及名字和姓氏,希望他們的手機也一樣) ):

    var viewModel =
        new
        {
            IdToken =
                idToken
        };

    // Application (client) ID
    var msIdPfClientId =
        @"...";

    // Application (client) URI
    var msIdPfClientUri =
        @"...";

    // Directory (tenant) ID
    var msIdPfTenantId =
        @"...";

    // Valid Issuer
    var msIdPfValidIssuer =
        @"...";

    var identityModelConfigManager =
        new ConfigurationManager<OpenIdConnectConfiguration>(
            $"{msIdPfValidIssuer}/.well-known/openid-configuration",
            new OpenIdConnectConfigurationRetriever());

    var oidcConfig =
        await identityModelConfigManager.GetConfigurationAsync();

    ISecurityTokenValidator securityTokenValidator =
        new JwtSecurityTokenHandler();

    // Initialize the token validation parameters
    var tokenValidationParameters =
        new TokenValidationParameters
        {
            // App Id URI and AppId of this service application are both valid audiences.
            ValidAudiences =
                new[]
                {
                    msIdPfClientId,
                    msIdPfClientUri
                },
            ValidIssuer =
                msIdPfValidIssuer,
            //// Support Azure AD V1 and V2 endpoints
            //ValidIssuers =
            //    validIssuers,
            // ValidateIssuer = true,
            IssuerSigningKeys =
                oidcConfig.SigningKeys
        };

    var claimsPrincipal =
        securityTokenValidator.ValidateToken(
            viewModel.IdToken,
            tokenValidationParameters,
            out var validatedSecurityToken);

然后在不久之后的適當時刻,我可以繼續使用/以傳統 (ASP.NET) Identity Framework 方式讓用戶登錄:

    await SignInManager.SignInAsync(
                            user,
                            isPersistent: false,
                            rememberBrowser: false);

盡管如此,我還發現創建一個 cookie 以指示用戶已通過身份平台登錄也很有用(在注銷過程中很有用)。

我最近得出了另一個結論——至少我覺得這對我來說是一個更好的選擇,如果不是其他人的話; 這是為了避開微軟的“身份平台”,它是 MSAL(微軟身份驗證庫)特定/擴展的偽裝,只是把它當作普通的“連接”/OIDC/OID-C 集成(與底層 Azure AD - 沒有自定義工作流分支到 BC/又名“Azure AD BC”/要求)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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