Мультитенант в OpenIDConnect .Net Framework

Короткий ответ: НЕТ! Длинный ответ:

  • Если вы не будете изменять строку (лечение будет доступно только для чтения), передайте ее как const ref&. (const ref&, очевидно, должно оставаться в пределах область действия, в то время как исполняемая функция выполняет)
  • Если вы планируете изменить ее или знаете, что она выйдет из области видимости (threads) , передайте ее как value, не копируйте const ref& внутри вашего тела функции.

Была запись на cpp-next.com под названием «Требуется скорость, перейдите по значению! «. TL; DR:

Guideline: не копируйте аргументы функции. Вместо этого передайте их по значению и пусть компилятор выполнит копирование.

ПЕРЕВОД ^ ^ / / 10]

Не копируйте аргументы функции --- означает: если вы планируете изменить значение аргумента, скопировав его во внутреннюю переменную, просто используйте аргумент значения вместо .

Итак, не делайте этого:

std::string function(const std::string& aString){
    auto vString(aString);
    vString.clear();
    return vString;
}

выполните следующее:

std::string function(std::string aString){
    aString.clear();
    return aString;
}

Когда вам нужно изменить значение аргумента в своем теле функции.

Вам просто нужно знать, как вы планируете использовать аргумент в теле функции. Только для чтения или NOT ... и если он находится в пределах видимости.

1
задан Mavi Domates 21 January 2019 в 14:45
поделиться

2 ответа

Для доставки мультитенантного приложения в AAD необходимо создать только одно приложение. Поэтому у вас также есть только один client_id . Убедитесь, что в вашем приложении включена функция «Multi-Tenanted».

Вы найдете много информации здесь: https://docs.microsoft.com/en-us/azure/active-directory/develop/howto-convert-app-to-be-multi-tenant

Также доступен полный образец: https://github.com/Azure-Samples/active-directory-dotnet-webapp-multitenant-openidconnect

   public void ConfigureAuth(IAppBuilder app)
    {         
        string ClientId = ConfigurationManager.AppSettings["ida:ClientID"];
        //fixed address for multitenant apps in the public cloud
        string Authority = "https://login.microsoftonline.com/common/";

        app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

        app.UseCookieAuthentication(new CookieAuthenticationOptions { });

        app.UseOpenIdConnectAuthentication(
            new OpenIdConnectAuthenticationOptions
            {
                ClientId = ClientId,
                Authority = Authority,
                TokenValidationParameters = new System.IdentityModel.Tokens.TokenValidationParameters
                {
                    // instead of using the default validation (validating against a single issuer value, as we do in line of business apps), 
                    // we inject our own multitenant validation logic
                    ValidateIssuer = false,
                },
                Notifications = new OpenIdConnectAuthenticationNotifications()
                {
                    RedirectToIdentityProvider = (context) =>
                    {
                        // This ensures that the address used for sign in and sign out is picked up dynamically from the request
                        // this allows you to deploy your app (to Azure Web Sites, for example)without having to change settings
                        // Remember that the base URL of the address used here must be provisioned in Azure AD beforehand.
                        string appBaseUrl = context.Request.Scheme + "://" + context.Request.Host + context.Request.PathBase;                         
                        context.ProtocolMessage.RedirectUri = appBaseUrl;
                        context.ProtocolMessage.PostLogoutRedirectUri = appBaseUrl;
                        return Task.FromResult(0);
                    },
                    // we use this notification for injecting our custom logic
                    SecurityTokenValidated = (context) =>
                    {
                        // retriever caller data from the incoming principal
                        string issuer = context.AuthenticationTicket.Identity.FindFirst("iss").Value;
                        string UPN = context.AuthenticationTicket.Identity.FindFirst(ClaimTypes.Name).Value;
                        string tenantID = context.AuthenticationTicket.Identity.FindFirst("http://schemas.microsoft.com/identity/claims/tenantid").Value;

                        if (
                            // the caller comes from an admin-consented, recorded issuer
                            (db.Tenants.FirstOrDefault(a => ((a.IssValue == issuer) && (a.AdminConsented))) == null)
                            // the caller is recorded in the db of users who went through the individual onboardoing
                            && (db.Users.FirstOrDefault(b =>((b.UPN == UPN) && (b.TenantID == tenantID))) == null)
                            )
                            // the caller was neither from a trusted issuer or a registered user - throw to block the authentication flow
                            throw new SecurityTokenValidationException();                            
                        return Task.FromResult(0);
                    },
                    AuthenticationFailed = (context) =>
                    {
                        context.OwinContext.Response.Redirect("/Home/Error?message=" + context.Exception.Message);
                        context.HandleResponse(); // Suppress the exception
                        return Task.FromResult(0);
                    }
                }
            });

    }
0
ответ дан Alex AIT 21 January 2019 в 14:45
поделиться

Ваш идентификатор клиента должен быть идентификатором клиента вашего приложения. Вы не создаете другое приложение в другом арендаторе. Установление авторитета для общего достаточно. Проверка эмитента может быть отключена, если вы хотите разрешить любого арендатора.

Затем, когда кто-то из другого арендатора входит в ваше приложение, его попросят дать согласие на необходимые вам разрешения. После этого в их клиенте автоматически создается субъект службы, представляющий ваше приложение. У него такой же идентификатор клиента.

0
ответ дан juunas 21 January 2019 в 14:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: