使用没有 OpenID Connect 和 Razor 页面的 ASP.NET 5.0 存储用户数据

Storing user data with ASP.NET 5.0 without OpenID Connect and Razor pages

在 ASP.NET 5.0 中,我想实现一个简单的 cookie authentication 并将用户数据安全地存储在数据库中。

cookie 身份验证工作正常,这样我就可以在前端实现 SPA 中所有与用户相关的功能,因此 Angular 应用程序之外没有导航。 (这样就不会重定向到外部 Razor 页面来实现例如登录功能。)

但是,我现在遇到了在服务器端安全存储用户数据的问题。 (例如,正确散列密码。)如果我使用 ASP.NET Identity,它会立即解决所有存储问题。问题是,所有示例都只显示了使用 Razor 页面和 OIDC 的实现。

是否可以仅使用 ASP.NET 身份来存储用户数据而不使用 Razor 页面和 OIDC?

我不想使用 ASP.NET 的嵌入式 OIDC 实现,因为我有一个很小的 ​​Angular SPA,所有重定向 from/to 身份的 Razor 页面用户体验不好。另一方面,如果我要使用 Identity 的 Razor 页面,我需要将它们设置为与我的 Angular 应用程序相同的样式,这对我来说似乎是一个难闻的代码重复。 (除其他外,我还需要对它们应用 material 设计。)

答案是肯定的,有这个可能!

首先,身份应该添加到services下面的方式:

services.AddIdentity<ApplicationUser, IdentityRole>(options => options.Stores.MaxLengthForKeys = 128)
        .AddEntityFrameworkStores<ApplicationDbContext>();

请注意,未使用 AddDefaultIdentity,因为 AddDefaultIdentity 也涉及默认的 Razor 页面,在我的情况下,我不想使用它们。

这样 UserManager 就可用了,它可以被注入到构造函数中,并且可以用于在数据库中创建用户。 (UserManager 处理用户数据的安全存储。)

然而,当有未经授权或被禁止的 API 调用时,后端会尝试重定向到一些不存在的默认路由。因此还需要添加以下配置:

services.ConfigureApplicationCookie(options =>
{
    options.Events.OnRedirectToLogin = (context) =>
    {
       context.Response.StatusCode = 401;
       return Task.CompletedTask;
    };
    options.Events.OnRedirectToAccessDenied = (context) =>
    {
        context.Response.StatusCode = 403;
        return Task.CompletedTask;
    };
});

使用上面的方法services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(..) 需要删除。