ASP.NET Identity için Özel Depolama Sağlayıcılarına Genel BakışOverview of Custom Storage Providers for ASP.NET Identity

Tom FitzMacken tarafındanby Tom FitzMacken

ASP.NET Identity, kendi depolama sağlayıcınızı oluşturmanızı ve uygulamayı yeniden çalıştırmadan uygulamanıza takmanızı sağlayan genişletilebilir bir sistemdir.ASP.NET Identity is an extensible system which enables you to create your own storage provider and plug it into your application without re-working the application. Bu konuda, ASP.NET Identity için özelleştirilmiş bir depolama sağlayıcısının nasıl oluşturulacağı açıklanmaktadır.This topic describes how to create a customized storage provider for ASP.NET Identity. Kendi depolama sağlayıcınızı oluşturmaya yönelik önemli kavramlar ele alınmaktadır, ancak özel bir depolama sağlayıcısı uygulamaya yönelik adım adım yönergeler değildir.It covers the important concepts for creating your own storage provider, but it is not step-by-step walkthrough of implementing a custom storage provider.

Özel bir depolama sağlayıcısı uygulama örneği için bkz. özel bir MySQL ASP.NET Identity depolama sağlayıcısı uygulama.For an example of implementing a custom storage provider, see Implementing a Custom MySQL ASP.NET Identity Storage Provider.

Bu konu ASP.NET Identity 2,0 için güncelleştirildi.This topic was updated for ASP.NET Identity 2.0.

Öğreticide kullanılan yazılım sürümleriSoftware versions used in the tutorial

  • Güncelleştirme 2 ile Visual Studio 2013Visual Studio 2013 with Update 2
  • ASP.NET Identity 2ASP.NET Identity 2

GirişIntroduction

Varsayılan olarak, ASP.NET Identity sistem kullanıcı bilgilerini bir SQL Server veritabanında depolar ve veritabanını oluşturmak için Entity Framework Code First kullanır.By default, the ASP.NET Identity system stores user information in a SQL Server database, and uses Entity Framework Code First to create the database. Birçok uygulama için bu yaklaşım iyi bir sonuç verir.For many applications, this approach works well. Ancak, Azure Tablo depolaması gibi farklı bir Kalıcılık mekanizması türü kullanmayı tercih edebilir veya varsayılan uygulamadan çok farklı bir yapıya sahip olan veritabanı tablolarına sahip olabilirsiniz.However, you may prefer to use a different type of persistence mechanism, such as Azure Table Storage, or you may already have database tables with a very different structure than the default implementation. Her iki durumda da, depolama mekanizmanız için özelleştirilmiş bir sağlayıcı yazabilir ve bu sağlayıcıyı uygulamanıza ekleyebilirsiniz.In either case, you can write a customized provider for your storage mechanism and plug that provider into your application.

ASP.NET Identity, Visual Studio 2013 şablonlarının çoğunda varsayılan olarak dahil edilir.ASP.NET Identity is included by default in many of the Visual Studio 2013 templates. ASP.NET Identity güncelleştirmelerini Microsoft ASPNET Identity EntityFramework NuGet paketiile edinebilirsiniz.You can get updates to ASP.NET Identity through Microsoft AspNet Identity EntityFramework NuGet package.

Bu konu aşağıdaki bölümleri içermektedir:This topic includes the following sections:

Mimariyi anlayınUnderstand the architecture

ASP.NET Identity, Yöneticiler ve depolar adlı sınıflardan oluşur.ASP.NET Identity consists of classes called managers and stores. Yöneticiler, uygulama geliştiricisinin ASP.NET Identity sisteminde Kullanıcı oluşturma gibi işlemleri gerçekleştirmek için kullandığı üst düzey sınıflardır.Managers are high-level classes which an application developer uses to perform operations, such as creating a user, in the ASP.NET Identity system. Depolar, kullanıcılar ve roller gibi varlıkların nasıl kalıcı olduğunu belirten alt düzey sınıflardır.Stores are lower-level classes that specify how entities, such as users and roles, are persisted. Depolar, kalıcılık mekanizmasıyla yakından ilişkilidir, ancak yöneticiler mağazalardan ayrılır, bu da tüm uygulamayı kesintiye uğratmadan Kalıcılık mekanizmasını değiştirebilirsiniz.Stores are closely coupled with the persistence mechanism, but managers are decoupled from stores which means you can replace the persistence mechanism without disrupting the entire application.

Aşağıdaki diyagramda Web uygulamanızın yöneticileriyle nasıl etkileşim kurduğu ve veri erişim katmanıyla etkileşim kuran bir şekilde nasıl depolandığı gösterilmektedir.The following diagram shows how your web application interacts with the managers, and stores interact with the data access layer.

ASP.NET Identity için özelleştirilmiş bir depolama sağlayıcısı oluşturmak için veri kaynağını, veri erişim katmanını ve bu veri erişim katmanıyla etkileşime geçen mağaza sınıflarını oluşturmanız gerekir.To create a customized storage provider for ASP.NET Identity, you have to create the data source, the data access layer, and the store classes that interact with this data access layer. Kullanıcı üzerinde veri işlemleri gerçekleştirmek için aynı yönetici API 'Lerini kullanmaya devam edebilirsiniz, ancak artık veriler farklı bir depolama sistemine kaydedilir.You can continue using the same manager APIs to perform data operations on the user but now that data is saved to a different storage system.

UserManager 'ın veya RoleManager 'ın yeni bir örneğini oluştururken Kullanıcı sınıfının türünü sağladığınızda ve depo sınıfının bir örneğini bağımsız değişken olarak geçirdiğinizde, yönetici sınıflarını özelleştirmeniz gerekmez.You do not need to customize the manager classes because when creating a new instance of UserManager or RoleManager you provide the type of the user class and pass an instance of the store class as an argument. Bu yaklaşım özelleştirilmiş sınıflarınızı var olan yapıya eklemenize olanak sağlar.This approach enables you to plug your customized classes into the existing structure. Yeni depolama sağlayıcısını kullanmak için uygulamayı yeniden yapılandırmabölümünde özelleştirilmiş mağaza sınıflarınız Ile UserManager ve roleManager örneğini oluşturmayı öğreneceksiniz.You will see how to instantiate UserManager and RoleManager with your customized store classes in the section Reconfigure application to use new storage provider.

Depolanan verileri anlayınUnderstand the data that is stored

Özel bir depolama sağlayıcısı uygulamak için, ASP.NET Identity ile kullanılan veri türlerini anlamanız ve uygulamanızla ilgili olan özelliklerin hangisi olduğuna karar vermelisiniz.To implement a custom storage provider, you must understand the types of data used with ASP.NET Identity, and decide which features are relevant to your application.

VeriData AçıklamaDescription
KullanıcılarUsers Web sitenizin kayıtlı kullanıcıları.Registered users of your web site. Kullanıcı kimliğini ve Kullanıcı adını içerir.Includes the user Id and user name. Kullanıcılar, sitenize özgü kimlik bilgileriyle oturum açıp (Facebook gibi bir dış siteden kimlik bilgilerini kullanmak yerine) ve Kullanıcı kimlik bilgilerinde herhangi bir şeyin değişip değişmediğini belirtmek için güvenlik damgasına sahip olabileceği karma bir parola içerebilir.Might include a hashed password if users log in with credentials that are specific to your site (rather than using credentials from an external site like Facebook), and security stamp to indicate whether anything has changed in the user credentials. Ayrıca, e-posta adresi, telefon numarası, iki öğeli kimlik doğrulamasının etkin olup olmadığını, geçerli başarısız oturum açma sayısını ve bir hesabın kilitlenip kilitlenmediğini de içerebilir.Might also include email address, phone number, whether two factor authentication is enabled, the current number of failed logins, and whether an account has been locked.
Kullanıcı TalepleriUser Claims Kullanıcının kimliğini temsil eden kullanıcı hakkındaki deyimler (veya talepler) kümesi.A set of statements (or claims) about the user that represent the user's identity. Kullanıcı kimliğinin, roller aracılığıyla elde edilebileceğinden daha fazla ifadesini etkinleştirebilir.Can enable greater expression of the user's identity than can be achieved through roles.
Kullanıcı oturumu açmaUser Logins Bir kullanıcıya oturum açarken kullanılacak dış kimlik doğrulama sağlayıcısı (Facebook gibi) hakkında bilgiler.Information about the external authentication provider (like Facebook) to use when logging in a user.
RollerRoles Sitenizin yetkilendirme grupları.Authorization groups for your site. Rol kimliği ve rol adı ("admin" veya "Employee" gibi) içerir.Includes the role Id and role name (like "Admin" or "Employee").

Veri erişim katmanını oluşturmaCreate the data access layer

Bu konuda, kullanacağınız Kalıcılık mekanizması hakkında bilgi sahibi olduğunuz ve bu mekanizma için nasıl varlık oluşturacağınız varsayılmaktadır.This topic assumes you are familiar with the persistence mechanism that you are going to use and how to create entities for that mechanism. Bu konu, depoları veya veri erişim sınıflarını oluşturma hakkında ayrıntılı bilgi sağlamaz; Bunun yerine, ASP.NET Identity çalışırken yapmanız gereken tasarım kararları hakkında bazı öneriler sağlar.This topic does not provide details about how to create the repositories or data access classes; instead, it provides some suggestions about the design decisions you need to make when working with ASP.NET Identity.

Özelleştirilmiş bir mağaza sağlayıcısı için depoları tasarlarken çok fazla özgürlük vardır.You have a lot of freedom when designing the repositories for a customized store provider. Yalnızca uygulamanızda kullanmayı düşündüğünüz özellikler için depolar oluşturmanız yeterlidir.You only need to create repositories for features that you intend to use in your application. Örneğin, uygulamanızda roller kullanmıyorsanız, roller veya Kullanıcı rolleri için depolama oluşturmanız gerekmez.For example, if you are not using roles in your application, you do not need to create storage for roles or user roles. Teknolojiniz ve mevcut altyapınız, ASP.NET Identity varsayılan uygulamasından çok farklı bir yapı gerektirebilir.Your technology and existing infrastructure may require a structure that is very different from the default implementation of ASP.NET Identity. Veri erişim katmanında, havuzlarınızın yapısıyla çalışma mantığını sağlarsınız.In your data access layer, you provide the logic to work with the structure of your repositories.

ASP.NET Identity 2,0 için veri depolarının MySQL uygulamasında, bkz. Mysqlidentity. SQL.For a MySQL implementation of data repositories for ASP.NET Identity 2.0, see MySQLIdentity.sql.

Veri erişim katmanında verileri ASP.NET Identity veri kaynağınıza kaydetme mantığını sağlarsınız.In the data access layer, you provide the logic to save the data from ASP.NET Identity to your data source. Özelleştirilmiş depolama sağlayıcınızla ilgili veri erişim katmanı, Kullanıcı ve rol bilgilerini depolamak için aşağıdaki sınıfları içerebilir.The data access layer for your customized storage provider might include the following classes to store user and role information.

örneğiClass AçıklamaDescription ÖrnekExample
BağlamContext Kalıcılık mekanizmanıza bağlanmak ve sorguları yürütmek için bilgileri kapsüller.Encapsulates the information to connect to your persistence mechanism and execute queries. Bu sınıf, veri erişim katmanınıza yönelik bir merkezidir.This class is central to your data access layer. Diğer veri sınıfları, işlemlerini gerçekleştirmek için bu sınıfın bir örneğini gerektirir.The other data classes will require an instance of this class to perform their operations. Mağaza sınıflarınızı bu sınıfın bir örneği ile de başlatacaksınız.You will also initialize your store classes with an instance of this class. MySQLDatabaseMySQLDatabase
Kullanıcı depolamasıUser Storage Kullanıcı bilgilerini depolar ve alır (Kullanıcı adı ve parola karması gibi).Stores and retrieves user information (such as user name and password hash). UserTable (MySQL)UserTable (MySQL)
Rol depolamaRole Storage Rol bilgilerini depolar ve alır (rol adı gibi).Stores and retrieves role information (such as the role name). RoleTable (MySQL)RoleTable (MySQL)
Userclaim depolamasıUserClaims Storage Kullanıcı talep bilgilerini depolar ve alır (talep türü ve değeri gibi).Stores and retrieves user claim information (such as the claim type and value). UserClaimsTable (MySQL)UserClaimsTable (MySQL)
UserLogins depolamasıUserLogins Storage Kullanıcı oturum açma bilgilerini depolar ve alır (örneğin, bir dış kimlik doğrulama sağlayıcısı).Stores and retrieves user login information (such as an external authentication provider). UserLoginsTable (MySQL)UserLoginsTable (MySQL)
UserRole depolamasıUserRole Storage Bir kullanıcının hangi rollere atandığını depolar ve alır.Stores and retrieves which roles a user is assigned to. UserRoleTable (MySQL)UserRoleTable (MySQL)

Yine de, uygulamanızda kullanmayı düşündüğünüz sınıfları uygulamanız gerekir.Again, you only need to implement the classes that you intend to use in your application.

Veri erişim sınıflarında, belirli bir kalıcılık mekanizmanız için veri işlemlerini gerçekleştirmek üzere kod sağlarsınız.In the data access classes, you provide code to perform data operations for your particular persistence mechanism. Örneğin, MySQL uygulamasının içinde UserTable sınıfı, kullanıcılar veritabanı tablosuna yeni bir kayıt eklemek için bir yöntem içerir.For example, within the MySQL implementation, the UserTable class contains a method to insert a new record into the Users database table. _database adlı değişken, MySQLDatabase sınıfının bir örneğidir.The variable named _database is an instance of the MySQLDatabase class.

public int Insert(TUser user)
{
    string commandText = @"Insert into Users (UserName, Id, PasswordHash, SecurityStamp,Email,EmailConfirmed,PhoneNumber,PhoneNumberConfirmed, AccessFailedCount,LockoutEnabled,LockoutEndDateUtc,TwoFactorEnabled)
        values (@name, @id, @pwdHash, @SecStamp,@email,@emailconfirmed,@phonenumber,@phonenumberconfirmed,@accesscount,@lockoutenabled,@lockoutenddate,@twofactorenabled)";
    Dictionary<string, object> parameters = new Dictionary<string, object>();
    parameters.Add("@name", user.UserName);
    parameters.Add("@id", user.Id);
    parameters.Add("@pwdHash", user.PasswordHash);
    parameters.Add("@SecStamp", user.SecurityStamp);
    parameters.Add("@email", user.Email);
    parameters.Add("@emailconfirmed", user.EmailConfirmed);
    parameters.Add("@phonenumber", user.PhoneNumber);
    parameters.Add("@phonenumberconfirmed", user.PhoneNumberConfirmed);
    parameters.Add("@accesscount", user.AccessFailedCount);
    parameters.Add("@lockoutenabled", user.LockoutEnabled);
    parameters.Add("@lockoutenddate", user.LockoutEndDateUtc);
    parameters.Add("@twofactorenabled", user.TwoFactorEnabled);

    return _database.Execute(commandText, parameters);
}

Veri erişim sınıflarınızı oluşturduktan sonra, veri erişim katmanındaki belirli yöntemleri çağıran mağaza sınıfları oluşturmanız gerekir.After creating your data access classes, you must create store classes that call the specific methods in the data access layer.

Kullanıcı sınıfını özelleştirmeCustomize the user class

Kendi depolama sağlayıcınızı uygularken, Microsoft. asp. net. Identity. EntityFramework ad alanındaki ıdentityuser sınıfına eşdeğer bir Kullanıcı sınıfı oluşturmanız gerekir:When implementing your own storage provider, you must create a user class which is equivalent to the IdentityUser class in the Microsoft.ASP.NET.Identity.EntityFramework namespace:

Aşağıdaki diyagramda, oluşturmanız gereken ıdentityuser sınıfı ve bu sınıfta uygulanacak arabirim gösterilmektedir.The following diagram shows the IdentityUser class that you must create and the interface to implement in this class.

IUser<TKey> arabirimi, UserManager 'ın istenen işlemleri gerçekleştirirken çağrı yapmaya çalıştığı özellikleri tanımlar.The IUser<TKey> interface defines the properties that the UserManager attempts to call when performing requested operations. Arabirim iki özellik içerir-kimlik ve Kullanıcı adı.The interface contains two properties - Id and UserName. Iuser<tkey> arabirimi, genel TKey parametresi aracılığıyla Kullanıcı için anahtar türünü belirtmenizi sağlar.The IUser<TKey> interface enables you to specify the type of the key for the user through the generic TKey parameter. ID özelliğinin türü, TKey parametresinin değeriyle eşleşir.The type of the Id property matches the value of the TKey parameter.

Kimlik çerçevesi, anahtar için bir dize değeri kullanmak istediğinizde, IUser arabirimini de (genel parametre olmadan) sağlar.The Identity framework also provides the IUser interface (without the generic parameter) when you want to use a string value for the key.

Identityuser sınıfı, IUser 'ı uygular ve Web sitenizdeki kullanıcılar için ek özellikler ya da oluşturucular içerir.The IdentityUser class implements IUser and contains any additional properties or constructors for users on your web site. Aşağıdaki örnek, anahtar için bir tamsayı kullanan bir ıdentityuser sınıfını gösterir.The following example shows an IdentityUser class that uses an integer for the key. ID alanı, genel parametresinin değeriyle eşleşecek şekilde int olarak ayarlanır.The Id field is set to int to match the value of the generic parameter.

public class IdentityUser : IUser<int>
{
    public IdentityUser() { ... }
    public IdentityUser(string userName) { ... }
    public int Id { get; set; }
    public string UserName { get; set; }
    // can also define optional properties such as:
    //    PasswordHash
    //    SecurityStamp
    //    Claims
    //    Logins
    //    Roles
}

Tüm uygulama için bkz. ıdentityuser (MySQL).For a complete implementation, see IdentityUser (MySQL).

Kullanıcı deposunu özelleştirmeCustomize the user store

Ayrıca, kullanıcının tüm veri işlemleri için yöntemler sağlayan bir UserStore sınıfı da oluşturursunuz.You also create a UserStore class that provides the methods for all data operations on the user. Bu sınıf, Microsoft. asp. net. Identity. EntityFramework ad alanındaki userStore<Tuser> sınıfına eşdeğerdir.This class is equivalent to the UserStore<TUser> class in the Microsoft.ASP.NET.Identity.EntityFramework namespace. UserStore sınıfınıza ıuserstore<TUser, TKey> ve isteğe bağlı arabirimlerden herhangi birini uygulayacağınızı uygulatyorsunuzdur.In your UserStore class, you implement the IUserStore<TUser, TKey> and any of the optional interfaces. Uygulamanızda sağlamak istediğiniz işlevselliğe göre hangi isteğe bağlı arabirimlerin uygulanacağını seçersiniz.You select which optional interfaces to implement based on the functionality you wish to provide in your application.

Aşağıdaki görüntüde, oluşturmanız gereken UserStore sınıfı ve ilgili arabirimler gösterilmektedir.The following image shows the UserStore class you must create and the relevant interfaces.

Visual Studio 'daki varsayılan proje şablonu, isteğe bağlı arabirimlerin çoğunun Kullanıcı deposunda uygulandığını varsayan kodu içerir.The default project template in Visual Studio contains code that assumes many of the optional interfaces have been implemented in the user store. Varsayılan şablonu özelleştirilmiş bir kullanıcı deposu ile kullanıyorsanız, Kullanıcı deponuzda isteğe bağlı arabirimler uygulamanız veya uygulanmayan arabirimlerde yöntemi artık çağırmak için şablon kodunu değiştirmeniz gerekir.If you are using the default template with a customized user store, you must either implement optional interfaces in your user store or alter the template code to no longer call methods in the interfaces you have not implemented.

Aşağıdaki örnek bir basit kullanıcı deposu sınıfını göstermektedir.The following example shows a simple user store class. Tuser genel parametresi, genellikle tanımladığınız ıdentityuser sınıfı olan Kullanıcı sınıfınızın türünü alır.The TUser generic parameter takes the type of your user class which usually is the IdentityUser class you defined. TKey genel parametresi, Kullanıcı anahtarınızın türünü alır.The TKey generic parameter takes the type of your user key.

public class UserStore : IUserStore<IdentityUser, int>
{
    public UserStore() { ... }
    public UserStore(ExampleStorage database) { ... }
    public Task CreateAsync(IdentityUser user) { ... }
    public Task DeleteAsync(IdentityUser user) { ... }
    public Task<IdentityUser> FindByIdAsync(int userId) { ... }
    public Task<IdentityUser> FindByNameAsync(string userName) { ... }
    public Task UpdateAsync(IdentityUser user) { ... }
    public void Dispose() { ... }
}

Bu örnekte, ExampleDatabase türünde Database adlı bir parametre alan Oluşturucu yalnızca veri erişim sınıfınıza nasıl geçilereceğine ilişkin bir örnektir.In this example, the constructor that takes a parameter named database of type ExampleDatabase is only an illustration of how to pass in your data access class. Örneğin, MySQL uygulamasında, bu Oluşturucu MySQLDatabase türünde bir parametre alır.For example, in the MySQL implementation, this constructor takes a parameter of type MySQLDatabase.

UserStore sınıfınız içinde, işlemleri gerçekleştirmek için oluşturduğunuz veri erişim sınıflarını kullanırsınız.Within your UserStore class, you use the data access classes that you created to perform operations. Örneğin, MySQL uygulamasında, UserStore sınıfının yeni bir kayıt eklemek için UserTable örneğini kullanan CreateAsync yöntemi vardır.For example, in the MySQL implementation, the UserStore class has the CreateAsync method which uses an instance of UserTable to insert a new record. Usertable nesnesindeki Insert yöntemi, önceki bölümde gösterilen yöntem ile aynıdır.The Insert method on the userTable object is the same method that was shown in the previous section.

public Task CreateAsync(IdentityUser user)
{
    if (user == null) {
        throw new ArgumentNullException("user");
    }

    userTable.Insert(user);

    return Task.FromResult<object>(null);
}

Kullanıcı deposunu özelleştirirken uygulanacak arabirimlerInterfaces to implement when customizing user store

Sonraki görüntüde, her arabirimde tanımlanan işlevlerle ilgili daha fazla ayrıntı gösterilmektedir.The next image shows more details about the functionality defined in each interface. Tüm isteğe bağlı arabirimler ıuserstore 'dan devralınır.All of the optional interfaces inherit from IUserStore.

  • IuserstoreIUserStore
    Iuserstore<TUser, TKey> arabirimi, Kullanıcı deponuzda uygulamanız gereken tek arabirimdir.The IUserStore<TUser, TKey> interface is the only interface you must implement in your user store. Kullanıcıları oluşturma, güncelleştirme, silme ve alma yöntemlerini tanımlar.It defines methods for creating, updating, deleting, and retrieving users.

  • IuserclaimstoreIUserClaimStore
    Iuserclaimstore<TUser, TKey> arabirimi Kullanıcı taleplerini etkinleştirmek için Kullanıcı deponuzda uygulamanız gereken yöntemleri tanımlar.The IUserClaimStore<TUser, TKey> interface defines the methods you must implement in your user store to enable user claims. Yöntemler içerir veya Kullanıcı taleplerini ekleme, kaldırma ve alma.It contains methods or adding, removing and retrieving user claims.

  • IuserloginstoreIUserLoginStore
    Iuserloginstore<TUser, TKey>, dış kimlik doğrulama sağlayıcılarını etkinleştirmek için Kullanıcı deponuzda uygulamanız gereken yöntemleri tanımlar.The IUserLoginStore<TUser, TKey> defines the methods you must implement in your user store to enable external authentication providers. Kullanıcı oturum açma bilgilerini ekleme, kaldırma ve alma ve oturum açma bilgilerine göre Kullanıcı alma yöntemi gibi yöntemleri içerir.It contains methods for adding, removing and retrieving user logins, and a method for retrieving a user based on the login information.

  • IuserrolestoreIUserRoleStore
    Iuserrolestore<TKey, tuser>arabirimi, bir kullanıcıyı bir rolle eşlemek için Kullanıcı deponuzda uygulamanız gereken yöntemleri tanımlar.The IUserRoleStore<TKey, TUser> interface defines the methods you must implement in your user store to map a user to a role. Bir kullanıcının rollerini ekleme, kaldırma ve alma yöntemlerini ve bir rolün bir rolün atanıp atanmadığını denetlemek için bir yöntem içerir.It contains methods to add, remove, and retrieve a user's roles, and a method to check if a user is assigned to a role.

  • IuserpasswordstoreIUserPasswordStore
    Iuserpasswordstore<TUser, TKey> arabirimi, Karma parolaları kalıcı hale getirmek için Kullanıcı deponuzda uygulamanız gereken yöntemleri tanımlar.The IUserPasswordStore<TUser, TKey> interface defines the methods you must implement in your user store to persist hashed passwords. Karma parolanın alınması ve ayarlanması için yöntemler ve kullanıcının bir parola ayarlayıp ayarlamadığını belirten bir yöntem içerir.It contains methods for getting and setting the hashed password, and a method that indicates whether the user has set a password.

  • IusersecuritystampstoreIUserSecurityStampStore
    Iusersecuritystampstore<TUser, TKey> arabirimi kullanıcının hesap bilgilerinin değişip değişmediğini belirten bir güvenlik damgası kullanmak için Kullanıcı deponuzda uygulamanız gereken yöntemleri tanımlar.The IUserSecurityStampStore<TUser, TKey> interface defines the methods you must implement in your user store to use a security stamp for indicating whether the user's account information has changed. Bu damga, Kullanıcı parolayı değiştirdiğinde veya oturum açma ekler veya kaldırdığında güncelleştirilir.This stamp is updated when a user changes the password, or adds or removes logins. Güvenlik damgasını alma ve ayarlama yöntemlerini içerir.It contains methods for getting and setting the security stamp.

  • IusertwofactorstoreIUserTwoFactorStore
    Iusertwofactorstore<TUser, TKey> arabirimi iki öğeli kimlik doğrulaması uygulamak için uygulamanız gereken yöntemleri tanımlar.The IUserTwoFactorStore<TUser, TKey> interface defines the methods you must implement to implement two factor authentication. Bir kullanıcı için iki öğeli kimlik doğrulamasının etkin olup olmadığını alma ve ayarlama yöntemlerini içerir.It contains methods for getting and setting whether two factor authentication is enabled for a user.

  • IuserphonenumberstoreIUserPhoneNumberStore
    Iuserphonenumberstore<TUser, TKey> arabirimi, Kullanıcı telefon numaralarını depolamak için uygulamanız gereken yöntemleri tanımlar.The IUserPhoneNumberStore<TUser, TKey> interface defines the methods you must implement to store user phone numbers. Telefon numarasını alma ve ayarlama ve telefon numarasının onaylanıp onaylanmayacağı yöntemlerini içerir.It contains methods for getting and setting the phone number and whether the phone number is confirmed.

  • IuseremailstoreIUserEmailStore
    Iuseremailstore<TUser, TKey> arabirimi, kullanıcı e-posta adreslerini depolamak için uygulamanız gereken yöntemleri tanımlar.The IUserEmailStore<TUser, TKey> interface defines the methods you must implement to store user email addresses. E-posta adresini alma ve ayarlama yöntemlerini ve e-postanın onaylanıp onaylanmadığını içerir.It contains methods for getting and setting the email address and whether the email is confirmed.

  • IuserlockoutstoreIUserLockoutStore
    Iuserlockoutstore<TUser, TKey> arabirimi, bir hesabı kilitleme hakkındaki bilgileri depolamak için uygulamanız gereken yöntemleri tanımlar.The IUserLockoutStore<TUser, TKey> interface defines the methods you must implement to store information about locking an account. Bu, başarısız olan erişim girişimlerinin geçerli sayısını alma, hesabın kilitlenip kilitlenmeyeceğini alma, bitiş tarihini alma ve ayarlama, başarısız girişim sayısını artırma ve başarısız girişim sayısını sıfırlama yöntemlerini içerir.It contains methods for getting the current number of failed access attempts, getting and setting whether the account can be locked, getting and setting the lock out end date, incrementing the number of failed attempts, and resetting the number of failed attempts.

  • IqueryableuserstoreIQueryableUserStore
    Iqueryableuserstore<TUser, TKey> arabirimi, bir sorgulanabilir kullanıcı deposu sağlamak için uygulamanız gereken üyeleri tanımlar.The IQueryableUserStore<TUser, TKey> interface defines the members you must implement to provide a queryable user store. Bu, sorgulanabilir kullanıcıları tutan bir özelliği içerir.It contains a property that holds the queryable users.

    Uygulamanızda gerekli olan arabirimleri uygulamanız gerekir; Örneğin, ıuserclaimstore, ıuserloginstore, ıuserrolestore, ıuserpasswordstore ve ıusersecuritystampstore arabirimleri aşağıda gösterildiği gibi.You implement the interfaces that are needed in your application; such as, the IUserClaimStore, IUserLoginStore, IUserRoleStore, IUserPasswordStore, and IUserSecurityStampStore interfaces as shown below.

public class UserStore : IUserStore<IdentityUser, int>,
                         IUserClaimStore<IdentityUser, int>,
                         IUserLoginStore<IdentityUser, int>,
                         IUserRoleStore<IdentityUser, int>,
                         IUserPasswordStore<IdentityUser, int>,
                         IUserSecurityStampStore<IdentityUser, int>
{
    // interface implementations not shown
}

Tüm uygulama için (tüm arabirimler dahil), bkz. userStore (MySQL).For a complete implementation (including all of interfaces), see UserStore (MySQL).

Identityuserclaim, ıdentityuserlogin ve ıdentityuserroleIdentityUserClaim, IdentityUserLogin, and IdentityUserRole

Microsoft. AspNet. Identity. EntityFramework ad alanı ıdentityuserclaim, ıdentityuserloginve ıdentityuserrole sınıflarının uygulamalarını içerir.The Microsoft.AspNet.Identity.EntityFramework namespace contains implementations of the IdentityUserClaim, IdentityUserLogin, and IdentityUserRole classes. Bu özellikleri kullanıyorsanız, bu sınıfların kendi sürümlerinizi oluşturmak ve uygulamanız için özellikleri tanımlamak isteyebilirsiniz.If you are using these features, you may want to create your own versions of these classes and define the properties for your application. Ancak bazen, temel işlemleri gerçekleştirirken bu varlıkların belleğe yüklenmemesinin (örneğin, bir kullanıcının talebini ekleme veya kaldırma) daha etkilidir.However, sometimes it is more efficient to not load these entities into memory when performing basic operations (such as adding or removing a user's claim). Bunun yerine, arka uç deposu sınıfları bu işlemleri doğrudan veri kaynağında yürütebilir.Instead, the backend store classes can execute these operations directly on the data source. Örneğin, UserStore. GetClaimsAsync () yöntemi userClaimTable. Findbyuserıd (User) yöntemini çağırabilir. ID) yöntemi doğrudan bu tabloda bir sorgu yürütmek ve talepler listesini döndürmek için yöntem.For example, the UserStore.GetClaimsAsync() method can call the userClaimTable.FindByUserId(user.Id) method to execute a query on that table directly and return a list of claims.

public Task<IList<Claim>> GetClaimsAsync(IdentityUser user)
{
    ClaimsIdentity identity = userClaimsTable.FindByUserId(user.Id);
    return Task.FromResult<IList<Claim>>(identity.Claims.ToList());
}

Rol sınıfını özelleştirmeCustomize the role class

Kendi depolama sağlayıcınızı uygularken, Microsoft. asp. net. Identity. EntityFramework ad alanındaki ıdentityrole sınıfına eşdeğer bir rol sınıfı oluşturmanız gerekir:When implementing your own storage provider, you must create a role class which is equivalent to the IdentityRole class in the Microsoft.ASP.NET.Identity.EntityFramework namespace:

Aşağıdaki diyagramda, oluşturmanız gereken ıdentityrole sınıfı ve bu sınıfta uygulanacak arabirim gösterilmektedir.The following diagram shows the IdentityRole class that you must create and the interface to implement in this class.

Irole<TKey> arabirimi, roleManager 'ın istenen işlemleri gerçekleştirirken çağrı yapmaya çalıştığı özellikleri tanımlar.The IRole<TKey> interface defines the properties that the RoleManager attempts to call when performing requested operations. Arabirim iki özellik kimliği ve adı içerir.The interface contains two properties - Id and Name. Irole<tkey> arabirimi, genel TKey parametresi aracılığıyla rolün anahtar türünü belirtmenizi sağlar.The IRole<TKey> interface enables you to specify the type of the key for the role through the generic TKey parameter. ID özelliğinin türü, TKey parametresinin değeriyle eşleşir.The type of the Id property matches the value of the TKey parameter.

Kimlik çerçevesi, anahtar için bir dize değeri kullanmak istediğinizde ırole arabirimini de (genel parametre olmadan) sağlar.The Identity framework also provides the IRole interface (without the generic parameter) when you want to use a string value for the key.

Aşağıdaki örnek, anahtar için bir tamsayı kullanan bir ıdentityrole sınıfını gösterir.The following example shows an IdentityRole class that uses an integer for the key. ID alanı, genel parametresinin değeriyle eşleşecek şekilde int olarak ayarlanır.The Id field is set to int to match the value of the generic parameter.

public class IdentityRole : IRole<int>
{
    public IdentityRole() { ... }
    public IdentityRole(string roleName) { ... }
    public int Id { get; set; }
    public string Name { get; set; }
}

Tüm uygulama için bkz. ıdentityrole (MySQL).For a complete implementation, see IdentityRole (MySQL).

Rol deposunu özelleştirmeCustomize the role store

Ayrıca, rollerdeki tüm veri işlemlerine yönelik yöntemleri sağlayan bir RoleStore sınıfı oluşturursunuz.You also create a RoleStore class that provides the methods for all data operations on roles. Bu sınıf, Microsoft. ASP. NET. Identity. EntityFramework ad alanındaki Rolestore<TRole> sınıfına eşdeğerdir.This class is equivalent to the RoleStore<TRole> class in the Microsoft.ASP.NET.Identity.EntityFramework namespace. RoleStore sınıfınıza ırolestore<TRole, tkey> ve isteğe bağlı olarak ıqueryablerolestore<trole, TKey> arabirimini uygulaırsınız.In your RoleStore class, you implement the IRoleStore<TRole, TKey> and optionally the IQueryableRoleStore<TRole, TKey> interface.

Aşağıdaki örnekte bir rol deposu sınıfı gösterilmektedir.The following example shows a role store class. TRole genel parametresi, genellikle tanımladığınız ıdentityrole sınıfı olan rol sınıfınızın türünü alır.The TRole generic parameter takes the type of your role class which usually is the IdentityRole class you defined. TKey genel parametresi, rol anahtarınızın türünü alır.The TKey generic parameter takes the type of your role key.

public class RoleStore : IRoleStore<IdentityRole, int>
{
    public RoleStore() { ... }
    public RoleStore(ExampleStorage database) { ... }
    public Task CreateAsync(IdentityRole role) { ... }
    public Task DeleteAsync(IdentityRole role) { ... }
    public Task<IdentityRole> FindByIdAsync(int roleId) { ... }
    public Task<IdentityRole> FindByNameAsync(string roleName) { ... }
    public Task UpdateAsync(IdentityRole role) { ... }
    public void Dispose() { ... }
}
  • Irolestore<TRole>IRoleStore<TRole>
    Irolestore arabirimi, rol deposu sınıfınıza uygulanacak yöntemleri tanımlar.The IRoleStore interface defines the methods to implement in your role store class. Rol oluşturma, güncelleştirme, silme ve alma yöntemlerini içerir.It contains methods for creating, updating, deleting and retrieving roles.

  • RoleStore<TRole>RoleStore<TRole>
    RoleStore 'u özelleştirmek için, ırolestore arabirimini uygulayan bir sınıf oluşturun.To customize RoleStore, create a class that implements the IRoleStore interface. Bu sınıfı yalnızca, sisteminizde roller kullanmak istiyorsanız uygulamanız gerekir.You only have to implement this class if want to use roles on your system. ExampleDatabase türünde Database adlı bir parametre alan Oluşturucu yalnızca veri erişim sınıfınıza nasıl geçilereceğine ilişkin bir örnekdir.The constructor that takes a parameter named database of type ExampleDatabase is only an illustration of how to pass in your data access class. Örneğin, MySQL uygulamasında, bu Oluşturucu MySQLDatabase türünde bir parametre alır.For example, in the MySQL implementation, this constructor takes a parameter of type MySQLDatabase.

    Tüm uygulama için bkz. Rolestore (MySQL) .For a complete implementation, see RoleStore (MySQL) .

Yeni depolama sağlayıcısını kullanmak için uygulamayı yeniden yapılandırınReconfigure application to use new storage provider

Yeni depolama sağlayıcınızı uyguladık.You have implemented your new storage provider. Şimdi, uygulamanızı bu depolama sağlayıcısını kullanacak şekilde yapılandırmanız gerekir.Now, you must configure your application to use this storage provider. Varsayılan depolama sağlayıcısı projenize dahil edilmiştir, varsayılan sağlayıcıyı kaldırmalı ve sağlayıcınızla değiştirmelisiniz.If the default storage provider was included in your project, you must remove the default provider and replace it with your provider.

MVC projesinde varsayılan depolama sağlayıcısını değiştirmeReplace default storage provider in MVC project

  1. NuGet Paketlerini Yönet penceresinde Microsoft ASP.NET Identity EntityFramework paketini kaldırın.In the Manage NuGet Packages window, uninstall the Microsoft ASP.NET Identity EntityFramework package. Bu paketi, Identity. EntityFramework yüklü paketlerinde arayarak bulabilirsiniz.You can find this package by searching in the Installed packages for Identity.EntityFramework.
    , Entity Framework kaldırmak isteyip istemediğiniz sorulur. You will be asked if you also want to uninstall Entity Framework. Uygulamanızın diğer bölümlerinde gerekmiyorsa, bunu kaldırabilirsiniz.If you do not need it in other parts of your application, you can uninstall it.

  2. Modeller klasöründeki IdentityModels.cs dosyasında, ApplicationUser ve applicationdbcontext sınıflarını silin veya not edin.In the IdentityModels.cs file in the Models folder, delete or comment out the ApplicationUser and ApplicationDbContext classes. MVC uygulamasında tüm IdentityModels.cs dosyasını silebilirsiniz.In an MVC application, you can delete the entire IdentityModels.cs file. Web Forms bir uygulamada, iki sınıfı silin, ancak IdentityModels.cs dosyasında da bulunan yardımcı sınıfını kaydettiğinizden emin olun.In a Web Forms application, delete the two classes but make sure you keep the helper class that is also located in the IdentityModels.cs file.

  3. Depolama sağlayıcınız ayrı bir projede yer alıyorsa, Web uygulamanızda buna bir başvuru ekleyin.If your storage provider resides in a separate project, add a reference to it in your web application.

  4. using Microsoft.AspNet.Identity.EntityFramework; tüm başvuruları, depolama sağlayıcınızın ad alanı için bir using ifadesiyle değiştirin.Replace all references to using Microsoft.AspNet.Identity.EntityFramework; with a using statement for the namespace of your storage provider.

  5. Startup.auth.cs sınıfında, configureauth yöntemini uygun bağlamın tek bir örneğini kullanacak şekilde değiştirin.In the Startup.Auth.cs class, change the ConfigureAuth method to use a single instance of the appropriate context.

    public void ConfigureAuth(IAppBuilder app)
    {
        app.CreatePerOwinContext(ExampleStorageContext.Create);
        app.CreatePerOwinContext(ApplicationUserManager.Create);
        ...
    
  6. Uygulama_başlangıç klasöründe, IdentityConfig.cs' yi açın.In the App_Start folder, open IdentityConfig.cs. ApplicationUserManager sınıfında, Create metodunu özelleştirilmiş Kullanıcı deponuzu kullanan bir Kullanıcı Yöneticisi döndürecek şekilde değiştirin.In the ApplicationUserManager class, change the Create method to return a user manager that uses your customized user store.

    public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) 
    {
        var manager = new ApplicationUserManager(new UserStore(context.Get<ExampleStorageContext>()));
        ...
    }
    
  7. Tüm başvuruları, ıdentityuserIle ApplicationUser ile değiştirin.Replace all references to ApplicationUser with IdentityUser.

  8. Varsayılan proje, Kullanıcı sınıfında, IUser arabiriminde tanımlanmayan bazı Üyeler içeriyor; e-posta, PasswordHash ve Generateuserıdentityasync gibi.The default project includes some members in user class which are not defined in the IUser interface; such as Email, PasswordHash, and GenerateUserIdentityAsync. Kullanıcı sınıfınız bu üyelere sahip değilse, bunları uygulamanız ya da bu üyeleri kullanan kodu değiştirmeniz gerekir.If your user class does not have these members, you must either implement them or change the code that uses these members.

  9. RoleManager örnekleri oluşturduysanız, bu kodu yeni RoleStore sınıfınızı kullanacak şekilde değiştirin.If you have created any instances of RoleManager, change that code to use your new RoleStore class.

    var roleManager = new RoleManager<IdentityRole>(new RoleStore(context.Get<ExampleStorageContext>()));
    
  10. Varsayılan proje, anahtar için bir dize değeri olan bir Kullanıcı sınıfı için tasarlanmıştır.The default project is designed for a user class that has a string value for the key. Kullanıcı sınıfınızın anahtar için farklı bir türü (örneğin, bir tamsayı) varsa, projeyi, sizin yazınızla çalışacak şekilde değiştirmeniz gerekir.If your user class has a different type for the key (such as an integer), you must change the project to work with your type. Bkz. ASP.NET Identity kullanıcılar Için birincil anahtarı değiştirme.See Change Primary Key for Users in ASP.NET Identity.

  11. Gerekirse, bağlantı dizesini Web. config dosyasına ekleyin.If needed, add the connection string to the Web.config file.

Diğer kaynaklarOther resources