Короткий ответ: НЕТ! Длинный ответ:
const ref&
. (const ref&
, очевидно, должно оставаться в пределах область действия, в то время как исполняемая функция выполняет) 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 ... и если он находится в пределах видимости.
Для доставки мультитенантного приложения в 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);
}
}
});
}
Ваш идентификатор клиента должен быть идентификатором клиента вашего приложения. Вы не создаете другое приложение в другом арендаторе. Установление авторитета для общего достаточно. Проверка эмитента может быть отключена, если вы хотите разрешить любого арендатора.
Затем, когда кто-то из другого арендатора входит в ваше приложение, его попросят дать согласие на необходимые вам разрешения. После этого в их клиенте автоматически создается субъект службы, представляющий ваше приложение. У него такой же идентификатор клиента.