ASP Core 1与PostgreSQL。授权和身份验证

3
我有一个基于ASP Core 1和PostgreSql数据存储的Web应用程序。现在我想要添加身份验证功能。我已经创建了带有授权功能的基本MVC项目,并且它与MsSql服务器一起使用时可以正常工作。但是PostgreSql怎么办?
首先,我创建了具有相同模式的数据库(通过"dnx ef migrations script"生成SQL并使用pg风格更新代码)。然后,我已经配置了Postgres的EF。
services.AddEntityFramework()
    .AddNpgsql()
    .AddDbContext<ApplicationDbContext>(options =>
        options.UseNpgsql(Configuration["Data:DefaultConnection:ConnectionString"]));

当我尝试注册新用户时,我收到一个错误42P01: relation \"AspNetUsers\" does not exist。我已经使用双引号括起来表名,但没有帮助。我无法访问默认的认证模型,也无法将名称属性添加到表名和字段名称中。
所以,我的问题是:
1.我的示例项目有什么问题,为什么我无法访问数据库? 2.更全局地说,ASP Core 1 + PostgreSql如何组织授权和身份验证最佳方式?我不需要所有ASP身份验证功能,只需要角色,我想要基于bigint的id,并扩展用户模型(表)。
注意:我使用EF7。
2个回答

2
所以我的第一个问题的答案在错误的数据库模式中。对于对模式感兴趣的人,我会提供完整的pg sql代码,但是我的第二个问题仍然没有解决。
CREATE TABLE public."AspNetRoles" (
    "Id" character varying(450) NOT NULL,
    "ConcurrencyStamp" text,
    "Name" character varying(256),
    "NormalizedName" character varying(256),
    CONSTRAINT pk_identityrole PRIMARY KEY ("Id")
);

CREATE TABLE public."AspNetUsers" (
    "Id" character varying(450) NOT NULL,
    "AccessFailedCount" integer NOT NULL,
    "ConcurrencyStamp" text,
    "Email" character varying(256),
    "EmailConfirmed" boolean NOT NULL,
    "LockoutEnabled" boolean NOT NULL,
    "LockoutEnd" timestamp without time zone,
    "NormalizedEmail" character varying(256),
    "NormalizedUserName" character varying(256),
    "PasswordHash" text,
    "PhoneNumber" text,
    "PhoneNumberConfirmed" boolean NOT NULL,
    "SecurityStamp" text,
    "TwoFactorEnabled" boolean NOT NULL,
    "UserName" character varying(256),
    CONSTRAINT pk_applicationuser PRIMARY KEY ("Id")
);

CREATE TABLE public."AspNetRoleClaims" (
    "Id" serial NOT NULL,
    "ClaimType" text,
    "ClaimValue" text,
    "RoleId" character varying(450),
    CONSTRAINT pk_identityroleclaim PRIMARY KEY ("Id"),
    CONSTRAINT fk_identityroleclaim_identityrole_roleid FOREIGN KEY ("RoleId")
        REFERENCES public."AspNetRoles" ("Id") MATCH SIMPLE
        ON UPDATE NO ACTION ON DELETE NO ACTION
);

CREATE TABLE public."AspNetUserClaims" (
    "Id" serial NOT NULL,
    "ClaimType" text,
    "ClaimValue" text,
    "UserId" character varying(450),
    CONSTRAINT pk_identityuserclaim PRIMARY KEY ("Id"),
    CONSTRAINT fk_identityuserclaim_applicationuser_userid FOREIGN KEY ("UserId")
        REFERENCES public."AspNetUsers" ("Id") MATCH SIMPLE
        ON UPDATE NO ACTION ON DELETE NO ACTION
);

CREATE TABLE public."AspNetUserLogins" (
    "LoginProvider" character varying(450) NOT NULL,
    "ProviderKey" character varying(450) NOT NULL,
    "ProviderDisplayName" text,
    "UserId" character varying(450),
    CONSTRAINT pk_identityuserlogin PRIMARY KEY ("LoginProvider", "ProviderKey"),
    CONSTRAINT fk_identityuserlogin_applicationuser_userid FOREIGN KEY ("UserId")
        REFERENCES public."AspNetUsers" ("Id") MATCH SIMPLE
        ON UPDATE NO ACTION ON DELETE NO ACTION
);

CREATE TABLE public."AspNetUserRoles" (
    "UserId" character varying(450) NOT NULL,
    "RoleId" character varying(450) NOT NULL,
    CONSTRAINT pk_identityuserrole PRIMARY KEY ("UserId", "RoleId"),
    CONSTRAINT fk_identityuserrole_applicationuser_userid FOREIGN KEY ("UserId")
        REFERENCES public."AspNetUsers" ("Id") MATCH SIMPLE
        ON UPDATE NO ACTION ON DELETE NO ACTION,
    CONSTRAINT fk_identityuserrole_identityrole_roleid FOREIGN KEY ("RoleId")
        REFERENCES public."AspNetRoles" ("Id") MATCH SIMPLE
        ON UPDATE NO ACTION ON DELETE NO ACTION
);

谢谢提供脚本,我认为表格应该像 SqlServer 提供程序一样自动创建。 - v1n1akabozo
但是它不会自动创建,我该如何强制它创建? - Andrius Bentkus
你的意思是希望EF自动创建数据库吗?有时使用自动迁移可能会让人感到不舒服(至少对我来说是这样),但如果你想要,你可以使用它。有大量关于如何在SqlServer中执行此操作的信息,但对于Postgres,您需要添加特定的提供程序。请注意,Postgres区分大小写,对于属性SomeProp,您将不得不在SQL查询中写入"SomeProperty"(带引号)。 - user3272018

0
我将我的数据库从SQL SERVER转移到了PostgreSQL,在转移之后,我发现了这个错误。当我检查我的数据库时,表名是小写的。我将所有AspTables和列名更改为默认名称,解决了我的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接