Kiracı kaydolma ve ekleme
Bu makalede, müşterinin kendi kuruluşlarını uygulamanıza kaydolmasını sağlayan çok müşterili bir uygulamada kaydolma işleminin nasıl uygulanacakları açıklanmıştır.
Kaydolma işleminin çeşitli nedenleri vardır:
- Bir AD yöneticisinin, müşterinin tüm kuruluşun uygulamayı kullanmasına izin vermesine izin verme.
- Kredi kartı ödemesini veya diğer müşteri bilgilerini toplayın.
- Uygulamanıza gereken kiracı başına tek bir kurulum gerçekleştirin.
Yönetici onayı ve Azure AD izinleri
Azure AD ile kimlik doğrulaması yapmak için bir uygulamanın kullanıcının dizinine erişmesi gerekir. Uygulamanın en azından kullanıcının profilini okuma iznine sahip olması gerekir. Bir kullanıcı ilk kez oturum ADE'de, istenen izinleri listeleye bir onay sayfası gösterir. Kabul Et'etıklayarak, kullanıcı uygulamaya izinler sağlar.
Varsayılan olarak, kullanıcı başına onay verilmektedir. Oturum alan her kullanıcı onay sayfasını görür. Ancak, Azure AD, bir AD yöneticisinin kuruluşuntamamına onay veren yönetici onayı 'ni de destekler.
Yönetici onayı akışı kullanılırken, onay sayfası AD yöneticisinin kiracının tamamı adına izin vermekte olduğunu ifade ediyor:

Yönetici Kabul Et'etıklayıp aynı kiracı içindeki diğer kullanıcılar oturum alasa da Azure AD onay ekranı atlar.
Yalnızca bir AD yöneticisi, kuruluşun tamamı adına izinler vermesi nedeniyle yönetici onayı ve yetkisine sahip olabilir. Yönetici olmayan bir kullanıcı yönetici onayı akışıyla kimlik doğrulaması yapmaya çalışırsa Azure AD bir hata görüntüler:

Uygulama daha sonraki bir noktada ek izinler gerektiriyorsa, müşterinin yeniden kaydolması ve güncelleştirilmiş izinleri onayları gerekir.
Kiracı kaydolmayı uygulama
Tailspin Surveys uygulaması için kaydolma işlemi için çeşitli gereksinimler tanımladık:
- Kullanıcıların oturum açması için önce kiracının kaydolması gerekir.
- Kaydolma, yönetici onayı akışını kullanır.
- Kaydolma, kullanıcının kiracısını uygulama veritabanına ekler.
- Kiracıdan sonra uygulama bir ekleme sayfası gösterir.
Bu bölümde, kaydolma işlemini uygulamamızda size yoleceğiz. "Kaydolma" ve "oturum açma" kavramının bir uygulama kavramı olduğunu anlamak önemlidir. Kimlik doğrulama akışı sırasında Azure AD, kullanıcının kaydolma sürecinde olup olmadığını doğal olarak bilmiyor. Bağlamı izlemek uygulamanın bir yolu olarak kabul etmektir.
Anonim bir kullanıcı Surveys uygulamasını ziyaret etti mi, kullanıcıya biri oturum açma, biri "şirketinizi kaydetme" (kaydolma) olmak üzere iki düğme gösterilir.

Bu düğmeler sınıfındaki eylemleri AccountController çağırır.
Eylem, OpenID aracı ara yazılımında kimlik doğrulama uç noktasına Bağlan bir SignInSignIndöndürür. Bu, ASP.NET Core'da kimlik doğrulamasını tetiklemek için varsayılan ASP.NET Core.
[AllowAnonymous]
public IActionResult SignIn()
{
return new ChallengeResult(
OpenIdConnectDefaults.AuthenticationScheme,
new AuthenticationProperties
{
IsPersistent = true,
RedirectUri = Url.Action("SignInCallback", "Account")
});
}
Şimdi eylemi SignUp karşılaştırın:
[AllowAnonymous]
public IActionResult SignUp()
{
var state = new Dictionary<string, string> { { "signup", "true" }};
return new ChallengeResult(
OpenIdConnectDefaults.AuthenticationScheme,
new AuthenticationProperties(state)
{
RedirectUri = Url.Action(nameof(SignUpCallback), "Account")
});
}
gibi, SignIn eylemi de bir SignUpChallengeResult döndürür. Ancak bu kez , içinde 'ye bir durum bilgisi AuthenticationProperties parçası ChallengeResult ekleriz:
- signup: Kullanıcının kaydolma işlemini başlatan Bir Boole bayrağı.
içinde durum AuthenticationProperties bilgileri, kimlik doğrulaması akışı sırasında AuthenticationProperties gidiş dönüş Bağlan openID durum parametresine eklenir.

Kullanıcı Azure AD'de kimlik doğrulaması yaptıktan ve uygulamaya geri yönlendirdikten sonra kimlik doğrulama bileti durumu içerir. "Kaydolma" değerinin tüm kimlik doğrulama akışında kalıcı olduğundan emin olmak için bu gerçeği kullanıyoruz.
Yönetici onay istemini ekleme
Azure AD'de yönetici onayı akışı, kimlik doğrulama isteğinde sorgu dizesine bir "istem" parametresi eklendiğinde tetiklenir:
/authorize?prompt=admin_consent&...
Surveys uygulaması, olay sırasında istemi RedirectToIdentityProvider ekler. Bu olay ara yazılım kimlik doğrulama uç noktasına yönlendirmeden hemen önce çağrılır.
public override Task RedirectToIdentityProvider(RedirectContext context)
{
if (context.IsSigningUp())
{
context.ProtocolMessage.Prompt = "admin_consent";
}
_logger.RedirectToIdentityProvider();
return Task.FromResult(0);
}
Ayarı ProtocolMessage.Prompt ara yazılıma kimlik doğrulama isteğine "prompt" parametresini eklemesi söyler.
İstem yalnızca kayıt sırasında gereklidir. Normal oturum açma bu oturum açmaları içermez. Aralarında ayrım yapmak için kimlik doğrulama signup durumu değerini kontrol etmek gerekir. Aşağıdaki genişletme yöntemi bu koşulu denetler:
internal static bool IsSigningUp(this AuthenticationProperties properties)
{
Guard.ArgumentNotNull(properties, nameof(properties));
string signupValue = string.Empty;
// Check the HTTP context and convert to string
if ((properties == null) ||
(!properties.Items.TryGetValue("signup", out signupValue)))
{
return false;
}
// We have found the value, so see if it's valid
bool isSigningUp;
if (!bool.TryParse(signupValue, out isSigningUp))
{
// The value for signup is not a valid boolean, throw
throw new InvalidOperationException($"'{signupValue}' is an invalid boolean value");
}
return isSigningUp;
}
Kiracı kaydetme
Surveys uygulaması, her kiracı ve kullanıcıyla ilgili bazı bilgileri uygulama veritabanında depolar.

Kiracı tablosunda IssuerValue, kiracı için verilen talebin değeridir. Azure AD için bu değerdir https://sts.windows.net/<tentantID> ve kiracı başına benzersiz bir değer verir.
Yeni bir kiracı kaydı olduğunda Surveys uygulaması veritabanına bir kiracı kaydı yazar. Bu olay içinde AuthenticationValidated gerçekleşir. (Kimlik belirteci henüz doğrulanmaz, bu nedenle talep değerlerine güvenemeden bu olaydan önce bunu yapma. Bkz. Kimlik Doğrulaması.
Surveys uygulamasından ilgili kod şu şekildedir:
public override async Task TokenValidated(TokenValidatedContext context)
{
var principal = context.Principal;
var userId = principal.GetObjectIdentifierValue();
var tenantManager = context.HttpContext.RequestServices.GetService<TenantManager>();
var userManager = context.HttpContext.RequestServices.GetService<UserManager>();
var issuerValue = context.SecurityToken.Issuer;
_logger.AuthenticationValidated(userId, issuerValue);
// Normalize the claims first.
NormalizeClaims(principal);
var tenant = await tenantManager.FindByIssuerValueAsync(issuerValue);
if (context.Properties.IsSigningUp())
{
if (tenant == null)
{
tenant = await SignUpTenantAsync(context, tenantManager)
.ConfigureAwait(false);
}
// In this case, we need to go ahead and set up the user signing us up.
await CreateOrUpdateUserAsync(context.Ticket, userManager, tenant)
.ConfigureAwait(false);
}
else
{
if (tenant == null)
{
_logger.UnregisteredUserSignInAttempted(userId, issuerValue);
throw new SecurityTokenValidationException($"Tenant {issuerValue} is not registered");
}
await CreateOrUpdateUserAsync(context.Principal, userManager, tenant)
.ConfigureAwait(false);
}
}
Bu kod şunları yapar:
- Kiracının issuer değerinin zaten veritabanında olup değildir. Kiracı henüz imzalanmazsa
FindByIssuerValueAsyncnull değerini döndürür. - Kullanıcı kaydolacaksa:
- Kiracıyı veritabanına ekleyin (
SignUpTenantAsync). - Kimliği doğrulanmış kullanıcıyı veritabanına ekleyin (
CreateOrUpdateUserAsync).
- Kiracıyı veritabanına ekleyin (
- Aksi takdirde normal oturum açma akışını tamamlarsınız:
- Kiracıyı alan kişi veritabanında bulunamamışsa kiracı kayıtlı değildir ve müşterinin kaydolması gerekir. Bu durumda, kimlik doğrulamasının başarısız olması için bir özel durum oluşturur.
- Aksi takdirde, zaten ( ) yoksa bu kullanıcı için bir veritabanı kaydı
CreateOrUpdateUserAsyncoluşturun.
Kiracıyı SignUpTenantAsync veritabanına ekleyen yöntem aşağıdaki şekildedir.
private async Task<Tenant> SignUpTenantAsync(TokenValidatedContext context, TenantManager tenantManager)
{
Guard.ArgumentNotNull(context, nameof(context));
Guard.ArgumentNotNull(tenantManager, nameof(tenantManager));
var principal = context.Principal;
var issuerValue = principal.GetIssuerValue();
var tenant = new Tenant
{
IssuerValue = issuerValue,
Created = DateTimeOffset.UtcNow
};
try
{
await tenantManager.CreateAsync(tenant)
.ConfigureAwait(false);
}
catch(Exception ex)
{
_logger.SignUpTenantFailed(principal.GetObjectIdentifierValue(), issuerValue, ex);
throw;
}
return tenant;
}
Surveys uygulamasındaki kayıt akışının tamamının özeti:
- Kullanıcı Kaydol düğmesine tıklar.
- Eylem
AccountController.SignUpbir zorluk sonucu döndürür. Kimlik doğrulama durumu "kaydolma" değerini içerir. - Olayda
RedirectToAuthenticationEndpointistemiadmin_consentekleyin. - OpenID Bağlan ara yazılımı Azure AD'ye yeniden yönlendirildi ve kullanıcı kimlik doğrulaması yaptı.
- Olayda
AuthenticationValidated"kaydolma" durumunun ne olduğunu bakın. - Kiracıyı veritabanına ekleyin.
Örnek kod