7

私は、Microsoft が One Asp.Net 実装で導入した新しい Forms Identity プロセス、特に Asp.NET MVC5 に関して苦労しています。

私の問題は 2 つあります。

  1. コンテキストを LocalDb ではなく通常の SQL インスタンスにポイントする方法。私のホスティングプロバイダーはそれをサポートしていないので、少なくともLocalDbは私にとって実行可能ではありません.

  2. ID エンティティにカスタム データベースを使用する方法。

Web.Config の「DefaultConnection」エントリの接続文字列を変更するだけでよいことがわかりました。しかし、それでも「AspNet」などのプレフィックスが付いた一連のテーブルが残ります。

以前の MembershipProvider アーキテクチャでは、フォーム認証プロセスがカスタム メンバーシップ プロセスを指す Web.config にエントリを配置することで、プロバイダーから継承し、必要なすべてを任意の方法で実装できました。

ただし、新しい ID プロセスでは、web.config に使用するフックがありません。さらに、それからの継承は、何も仮想的ではないように見えるため、何の役にも立ちません。さらに、既存のコンテキストから継承して起動することになります。

適切な新しいインターフェイスを実装するエンティティで独自のコンテキストを使用しようとしましたが、コンテキストを完全に無視するだけでなく、デフォルトの DefaultConnection 接続文字列で localdb を使用し、独自のコンテキストを無視しました。

これは Microsoft の新しい発案によるものであるため、新しいプロセスをカスタマイズする方法に関する実際のウォークスルーはなく、新しいプロセスの素晴らしさを示すデモのみです。

独自の ID プロセスを展開し、それを OWIN プロセスに接続するという Web のエントリに出くわしましたが、私は OWIN にまったく慣れていないため、これを行う方法について少なくともいくつかの情報が必要です。(私の OWIN プロジェクトへの最初の進出は、何の成果も得ていません)

誰か情報を持っていますか?

4

1 に答える 1

1

更新: このプロセスについてさらに多くのことを学び、私の答えが完全にはほど遠いことに気付いたので、私は自分の答えを完全に書き直しています。

最初に、アイデンティティの IdentyXXX クラスから継承して、エンティティを作成しました (ここではサンプル用に 1 つだけ提供します)。

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using NTier.Web.Core.Interfaces.Common;
using NTier.Web.Core.Interfaces.DataModels;
using NTier.Web.Core.Interfaces.Stores;


namespace NTier.Web.DataAccess.Entities
{
    public sealed class MemberEntity : IdentityUser<Guid, MemberLogin, MemberRole, MemberClaim>,
        IMemberDataModel, IAuditable
    {

        public MemberEntity()
        {
            Id = Guid.NewGuid();
        }

        #region Overrides of IdentityUser<Guid,MemberLogin,MemberRole,MemberClaim>

        public override Guid Id
        {
            get { return base.Id; }
            set
            {
                base.Id = value != Guid.Empty ? value : base.Id;
            }
        }

        #region Overrides of IdentityUser<Guid,MemberLogin,MemberRole,MemberClaim>

        public override string PasswordHash
        {
            get { return base.PasswordHash; }
            set
            {
                base.PasswordHash = !string.IsNullOrWhiteSpace(value) ? value : base.PasswordHash ;
            }
        }

        #endregion

        #endregion

        public Guid Identity
        {
            get { return Id; }
            set
            {
                if (value != Guid.Empty)
                {
                    Id = value;
                }
            }
        }


        public string Moniker { get; set; }

        [MaxLength(256)]
        public string FirstName { get; set; }
        [MaxLength(256)]
        public string LastName { get; set; }
        [MaxLength(256)]
        public string Middle { get; set; }

        public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<MemberEntity, Guid> manager)
        {
            // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
            var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
            // Add custom user claims here
            return userIdentity;
        }

        #region Implementation of IAuditable
        public DateTime DateTimeCreated { get; set; }
        public DateTime? DateTimeModified { get; set; }
        public DateTime? DateTimeDeleted { get; set; }
        public DateTime? DateTimeArchived { get; set; }
        public string CreatedBy { get; set; }
        public string ModifiedBy { get; set; }
        public string DeletedBy { get; set; }
        public string ArchivedBy { get; set; }
        public bool IsDeleted { get; set; }
        public bool IsArchived { get; set; }
        #endregion
    }
}

次に、DbContext の OnModelCreating メソッドを次のようにオーバーライドしました。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            if (modelBuilder == null) throw new ArgumentNullException("modelBuilder");

            modelBuilder.Entity<WebSiteEntity>()
                        .HasKey(site => site.Identity)
                        .ToTable("WebSite");

            #region Security

            modelBuilder.Entity<MemberEntity>()
                        .ToTable("Member")
                        .HasMany(u => u.Roles)
                        .WithRequired()
                        .HasForeignKey(ur => ur.UserId);
            modelBuilder.Entity<MemberEntity>()
                        .HasMany(u => u.Claims)
                        .WithRequired()
                        .HasForeignKey(uc => uc.UserId);
            modelBuilder.Entity<MemberEntity>()
                        .HasMany(u => u.Logins)
                        .WithRequired()
                        .HasForeignKey(ul => ul.UserId);
            modelBuilder.Entity<MemberEntity>()
                        .Property(u => u.Moniker)
                        .HasMaxLength(50)
                        .HasColumnAnnotation("Index",
                                            new IndexAnnotation(new IndexAttribute("UserNameIndex")
                                                                {
                                                                    IsUnique = true,
                                                                    IsClustered = false,
                                                                    Order = 2
                                                                }))
                        .HasColumnAnnotation("Index",
                                            new IndexAnnotation(new IndexAttribute("MonikerIndex")
                                                                {
                                                                    IsUnique = true,
                                                                    IsClustered = false,
                                                                    Order = 1
                                                                }));
            modelBuilder.Entity<MemberEntity>()
                        .Property(u => u.LastName)
                        .HasMaxLength(256)
                        .HasColumnAnnotation("Index",
                                            new IndexAnnotation(new IndexAttribute("UserNameIndex")
                                                                {
                                                                    IsUnique = true,
                                                                    IsClustered = false,
                                                                    Order = 3
                                                                }))
                        .HasColumnAnnotation("Index",
                                            new IndexAnnotation(new IndexAttribute("MonikerIndex")
                                                                {
                                                                    IsUnique = true,
                                                                    IsClustered = false,
                                                                    Order = 2
                                                                }));
            ;
            modelBuilder.Entity<MemberEntity>()
                        .Property(u => u.FirstName)
                        .HasMaxLength(256)
                        .HasColumnAnnotation("Index",
                                            new IndexAnnotation(new IndexAttribute("UserNameIndex")
                                                                {
                                                                    IsUnique = true,
                                                                    IsClustered = false,
                                                                    Order = 4
                                                                }))
                        .HasColumnAnnotation("Index",
                                            new IndexAnnotation(new IndexAttribute("MonikerIndex")
                                                                {
                                                                    IsUnique = true,
                                                                    IsClustered = false,
                                                                    Order = 3
                                                                }));
            ;
            modelBuilder.Entity<MemberEntity>()
                        .Property(u => u.Middle)
                        .HasMaxLength(256);
            modelBuilder.Entity<MemberEntity>()
                        .Property(u => u.UserName)
                        .IsRequired()
                        .HasMaxLength(256)
                        .HasColumnAnnotation("Index",
                                            new IndexAnnotation(new IndexAttribute("UserNameIndex")
                                                                {
                                                                    IsUnique = true,
                                                                    IsClustered = false,
                                                                    Order = 1
                                                                }))
                        .HasColumnAnnotation("Index",
                                            new IndexAnnotation(new IndexAttribute("MonikerIndex")
                                                                {
                                                                    IsUnique = true,
                                                                    IsClustered = false,
                                                                    Order = 4
                                                                }));
            modelBuilder.Entity<MemberEntity>()
                        .Property(u => u.Email)
                        .HasMaxLength(256);
            modelBuilder.Entity<MemberRole>()
                        .HasKey(userRole => new
                                            {
                                                userRole.UserId,
                                                userRole.RoleId
                                            })
                        .ToTable("MemberRole");
            modelBuilder.Entity<MemberLogin>()
                        .HasKey(login => new
                                        {
                                            login.UserId,
                                            login.ProviderKey,
                                            login.LoginProvider
                                        })
                        .ToTable("MemberLogin");
            modelBuilder.Entity<MemberClaim>()
                        .ToTable("MemberClaim");
            modelBuilder.Entity<RoleEntity>()
                        .ToTable("Role");
            modelBuilder.Entity<RoleEntity>()
                        .Property(r => r.Name)
                        .IsRequired()
                        .HasMaxLength(256)
                        .HasColumnAnnotation("Index",
                                            new IndexAnnotation(new IndexAttribute("RoleNameIndex")
                                                                {
                                                                    IsUnique = true
                                                                }));
            modelBuilder.Entity<RoleEntity>()
                        .HasMany(r => r.Users)
                        .WithRequired()
                        .HasForeignKey(ur => ur.RoleId);

            #endregion
于 2013-09-22T23:35:50.587 に答える