首页 > 解决方案 > 在没有 OpenID Connect 和 Razor 页面的情况下使用 ASP.NET 5.0 存储用户数据

问题描述

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

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

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

是否有可能仅使用 ASP.NET Idenitity 来存储用户数据而不使用 Razor 页面和 OIDC?

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

标签: asp.netasp.net-coreasp.net-identity

解决方案


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

首先应通过services以下方式添加Identity:

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(..) 需要删除。


推荐阅读