asp.net - 带有 PostgreSql 的 ASP Core 1。授权和认证

标签 asp.net entity-framework postgresql authorization asp.net-core

我有一个基于 ASP Core 1 的 Web 应用程序,带有 PostgreSql 数据存储。现在我想添加身份验证功能。我已经创建了具有授权的基本示例 mvc 项目,它可以很好地与 MsSql 服务器一起工作。但是 PostgreSql 呢?

首先我创建了具有相同模式的数据库(sql 是通过 dnx ef migrations script 生成的,代码是用 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。

最佳答案

所以我第一个问题的答案是错误的数据库模式。对于对模式感兴趣的人,我得到了完整的 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
);

关于asp.net - 带有 PostgreSql 的 ASP Core 1。授权和认证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36887179/

相关文章:

c# - 这是一种安全且*相对可行*的异步记录某些事件的方法吗?

c# - 中等信任托管的 AutoMapper 替代品

c# - 加载后如何使用 POCO 和 DbContext 初始化 Entity Framework 中的对象?

c# - AutoMapper - 可空和不可空整数的不同 ProjectUsings

sql - 如何在 PostgreSQL 的换行符上将一个值拆分为多行?

asp.net - 获取 ASP.NET 表单名称

c# - 如何在 ASP.NET CORE 中签署 XML SAML 断言

c# - 如何通过代码根据行的键值选择gridview中的行?

postgresql - PostgreSQL 中的事后死锁调试

sql - 将一个表中的值添加到另一个表