使用部分身份框架在 ASP.NET Core 中存储用户 ID

     2023-03-30     221

关键词:

【中文标题】使用部分身份框架在 ASP.NET Core 中存储用户 ID【英文标题】:Storing a UserID in ASP.NET Core with partial Identity Framework 【发布时间】:2021-09-07 13:33:01 【问题描述】:

我已经使用身份框架持久 cookie(如果用户选择记住我)或会话 cookie 创建了一个登录功能,如果只是标准登录并且不记住我被勾选。我使用以下代码:

                        var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);

                    if (RememberMe)
                    
                        await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme,
                            new ClaimsPrincipal(claimsIdentity),
                            new AuthenticationProperties
                            
                                IsPersistent = RememberMe,
                                ExpiresUtc = DateTimeOffset.UtcNow.AddHours(2)
                            );
                    
                    else
                    
                        await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme,
                            new ClaimsPrincipal(claimsIdentity));
                    
                    return RedirectToPage("/index");

我的前端使用 VueJS,所以我向我的 SQL 服务器发出各种 axios POST 请求,所以我设置了一个控制器来处理这个,如下例所示:

        [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult AddFirm([FromBody] FirmModel model)
    

        String query = "exec dbo.A2Q_Edit_0112_RR_UploadNewReview_AddFirm @FIRM_NAME, @USER_ID";
        System.Diagnostics.Debug.WriteLine("value:" + model.FIRM_NAME);
        using (var connection = new SqlConnection(connectionString))
        
            var json = connection.QuerySingle<string>(query, new  FIRM_NAME = model.FIRM_NAME , USER_ID = USER_ID);
            return Content(json, "application/json");
        

    

正如您将看到的,我的控制器在我的 SQL 查询中包含一个参数,以捕获启动存储过程的用户 ID。我想存储这个变量服务器端。我已经阅读了很多帖子,似乎很多人暗示身份来处理这个问题,因为会话不可靠地存储用户数据。因此,我很好奇当我只使用有限版本的身份来制作 cookie 时如何使用身份。我不需要身份和表格等的所有开销。有没有办法使用身份来存储这些类似于会话的用户变量?如果没有,是否有使用此 cookie 存储用户 ID 或充当用户 ID 的安全方式?或者根据我的描述,在当今时代,使用 ASP.NET Core 3.1 和 IIS 8 会话是最好的吗?

这似乎是一件简单的事情,但我正在努力解决这一方面的问题,以便在我的 sql 查询参数中填充这个用户 ID 变量,而不是存储在 VueJS 的前端。

*警告我将来可能会使用 signalIR,以便根据我在堆栈上看到的帖子的理解,取消会话作为一个选项。

【问题讨论】:

【参考方案1】:

如果你的问题没问题,我们需要某种机制来为每个请求获取UserId

如果是这样,请考虑将 UserId 放入 cookie 中,这不是需要安全的东西,因为即使 jwt 令牌具有 sub 密钥,也打算保存这样的某种值。

在 ASP 网络中使用默认的.AddCookie 扩展名,您的登录过程应该是

// Create the claims
var claims = new List<Claim>

    new Claim(ClaimTypes.NameIdentifier, [The UserId goes here]),
    // some other require stuff
;

// Sign in
var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme,
    new ClaimsPrincipal(claimsIdentity),
    new AuthenticationProperties
    
        IsPersistent = RememberMe,
        ExpiresUtc = DateTimeOffset.UtcNow.AddHours(2)
    );

现在userId被存储在cookie里面,不要试图解密,这是生成CfDJ8MblQARvMeFAppYZW16O0Qm0moCi0%2Fu77SujBcwhrmg2gAtPiCrKJEcAL3Ry%2By9Xp8subrazS5ajc%2F4dD153VZrndwSU3dVXmESF0NZxW8oWmyo5lhuGSv9LpgAuQs6pEfRJCeLXpE4%2FxU9SDzyWlk4LLf9HzxiBXTYswPZdvnLr后cookie内容的示例形式

以及与 cookie 相关联的请求。我们可以从User 中获取userId 作为HttpContext 的属性。

public IActionResult Index()

    var user = HttpContext.User.FindFirst(ClaimTypes.NameIdentifier);
    var myUserId = user.Value;
    // Then pass it along as wished

关于使用 SignalR:您的意思是注销用户吗?如果是这样,signalR 可以处理快乐的情况,只要应用程序仍然有足够的连接(webSocket 保持它,小心,想象一下只有 3-500 CCU 或更多,只是为了这个有时的任务?即使连接断开并重新连接,您仍然必须处理该逻辑)。

相反,为什么不在您登录时为 cookie 附加一个唯一密钥,该密钥会为每个登录会话重新呈现。然后有一个中间件来检查该密钥是否存在于黑名单中(将其存储为缓存会很好),我们将在这里抛出所有需要锁定的信息(只要 cookie 生命周期就过期,在这种情况下, 2 小时)。

完成,不再保持连接,不再有快乐-不快乐的情况以及 websocket 带来的所有复杂性。

【讨论】:

像魅力一样工作。我只是说 SignalR,因为我读过你不能使用 SignalR 的会话,所以它是一个或另一个。使用 cookie 可以直接解决这个问题。我想我担心用户可以解密 cookie 并更改里面的 userID 来冒充另一个用户。但是,我可以只使用更复杂的用户 ID,因此如果解密它就不能被模拟。已接受答案!

ASP .NET Core 身份登录管理器

...。在登录方法SignInManager中的帐户控制器中返回成功。在部分视图中,Login\\Register的链接添加了注入和库(根据其实现 查看详情

应该将身份验证令牌存储在 ASP.Net Core 的啥位置

...】:2017-10-3018:00:09【问题描述】:我的应用程序有一个API部分和一个网站部分。在网站上,用户可以登录并从API获取JWT不记名令牌。我现在的问题是:我应该在哪里存储该令牌?有人 查看详情

在 ASP.NET Core 中使用多个身份验证方案

】在ASP.NETCore中使用多个身份验证方案【英文标题】:UsingmultipleauthenticationschemesinASP.NETCore【发布时间】:2017-10-0316:31:39【问题描述】:我有使用ASP.NETCore开发的WebAPI,我需要能够为同一服务使用基本和不记名身份验证方案。由于... 查看详情

如何在 ASP.NET Core 3 上同时使用 Azure AD 身份验证和身份?

】如何在ASP.NETCore3上同时使用AzureAD身份验证和身份?【英文标题】:HowtousebothAzureADauthenticationandIdentityonASP.NETCore3?【发布时间】:2020-05-2814:49:45【问题描述】:Web应用程序应允许拥有AD帐户的内部员工使用AzureAD身份验证在应用程... 查看详情

使用 IdentityServer4、Asp.Net Core Identity 和自定义提供程序进行 Blazor WebAssembly 身份验证,无需实体框架

】使用IdentityServer4、Asp.NetCoreIdentity和自定义提供程序进行BlazorWebAssembly身份验证,无需实体框架【英文标题】:BlazorWebAssemblyAuthenticationwithIdentityServer4,Asp.NetCoreIdentityandcustomproviderwithoutEntityFramework【发布时间】:2020-09-1423:53:29【... 查看详情

如何先用asp.net身份框架数据库将asp.net mvc迁移到asp.net core

】如何先用asp.net身份框架数据库将asp.netmvc迁移到asp.netcore【英文标题】:Howtomigrateasp.netmvctoasp.netcorewithasp.netidentityframeworkdatabasefirst【发布时间】:2021-10-0520:39:15【问题描述】:我有一个数据库优先的asp.netmvc应用程序,现在我想... 查看详情

使用模拟的 ASP.NET Core 无法访问用户身份

】使用模拟的ASP.NETCore无法访问用户身份【英文标题】:ASP.NETCoreusingImpersonationcannotaccessUserIdentity【发布时间】:2017-07-0515:59:36【问题描述】:我正在使用Windows模拟在VisualStudioCode中构建一个ASP.NETCoreAPI(1.1)进行身份验证。(API允... 查看详情

如何使用 Microsoft 身份平台身份验证在 ASP.NET Core Web 应用程序中获取 JWT 令牌?

】如何使用Microsoft身份平台身份验证在ASP.NETCoreWeb应用程序中获取JWT令牌?【英文标题】:HowdoIgetholdofaJWTtokeninanASP.NETCoreWebAppusingMicrosoftidentityplatformauthentication?【发布时间】:2021-12-2404:30:55【问题描述】:我已经使用VisualStudio2022... 查看详情

使用 ASP.NET Core 在 POST 请求的标头中包含身份验证

】使用ASP.NETCore在POST请求的标头中包含身份验证【英文标题】:IncludingAuthenticationintheHeaderofaPOSTRequestusingASP.NETCore【发布时间】:2021-12-1108:15:30【问题描述】:我正在尝试请求接收会话ID以与支付网关集成。varm=System.Text.Encoding.Unic... 查看详情

如何在 ASP.NET Core 3.1 中启用多重身份验证?

...020-08-3101:32:49【问题描述】:在我的aspnetcore3.1项目中,我使用jwt进行身份验证。问题是我也在使用azure客户端来获取vm大小名称列表,并且它也在使用Bearer令牌。现在测试我使用azure中的AllowAnonymo 查看详情

没有 ASP.NET 身份的 .NET Core 外部身份验证

....NETIdentity【发布时间】:2018-06-1516:09:59【问题描述】:我使用自己的JWT令牌身份验证,而不是默认模板免费提供的asp.net身份。我到处寻找一些关于如何在没有asp.net身份的情况下实现外部身份验证的文档/指南,但所有文章都是针... 查看详情

ASP.NET Core 中的基本身份验证

...0916:06:02【问题描述】:问题如何在ASP.NETCoreWeb应用程序中使用自定义成员身份实现基本身份验证?备注在MVC5中,我使用了article中的说明,这需要在WebConfig中添加一个模块。我仍在IIS上部署我的新MVCCore应用程序,但这种方法似乎... 查看详情

Cookie 身份验证 ASP.NET Core

...间】:2017-03-3012:57:27【问题描述】:我可以在ITicketStore中使用MemoryCache来存储AuthenticationTicket吗?背景:我的网络应用正在使用Cookie身份验证:app.UseCookieAuthentication(newCookieAuthenticati 查看详情

检查用户是不是在 ASP.NET Core 中使用基于令牌的身份验证登录

】检查用户是不是在ASP.NETCore中使用基于令牌的身份验证登录【英文标题】:CheckifuserisloggedinwithTokenBasedAuthenticationinASP.NETCore检查用户是否在ASP.NETCore中使用基于令牌的身份验证登录【发布时间】:2017-05-1000:18:33【问题描述】:我... 查看详情

为啥在使用 ASP.NET Core Identity 和基于令牌的身份验证时登录新用户?

】为啥在使用ASP.NETCoreIdentity和基于令牌的身份验证时登录新用户?【英文标题】:Whysign-inanewuserwhenusingASP.NETCoreIdentityandtoken-basedauth?为什么在使用ASP.NETCoreIdentity和基于令牌的身份验证时登录新用户?【发布时间】:2019-09-1711:51:1... 查看详情

在 Blazor 中同时使用 ASP.Net Core Identity 和 Azure 身份验证

】在Blazor中同时使用ASP.NetCoreIdentity和Azure身份验证【英文标题】:UsingASP.NetCoreIdentityandAzureauthenticationtogetherinBlazor【发布时间】:2021-05-2807:25:25【问题描述】:我有一个服务器端Blazor应用程序,它已成功与Azure集成以进行身份​... 查看详情

使用 ADFS 的 JWT Bearer 身份验证将 ASP.NET Framework 迁移到 ASP.NET Core 3.1

】使用ADFS的JWTBearer身份验证将ASP.NETFramework迁移到ASP.NETCore3.1【英文标题】:MigrateASP.NETFrameworktoASP.NETCore3.1withJWTBearerauthenticationfromADFS【发布时间】:2020-05-2522:31:21【问题描述】:ASP.NET框架我们有一个现有的ASP.NETFramework网站,它... 查看详情

在 asp.net core 3.1+ 中使用多个中间件进行身份验证和授权

】在asp.netcore3.1+中使用多个中间件进行身份验证和授权【英文标题】:Authenticationandauthorizationwithmultiplemiddlewaresinasp.netcore3.1+【发布时间】:2021-05-1106:10:42【问题描述】:我正在尝试在asp.netcore3.1API项目中配置身份验证和授权中间... 查看详情