Blazor Web 程序集在每个请求中发送数据

Posted

技术标签:

【中文标题】Blazor Web 程序集在每个请求中发送数据【英文标题】:Blazor web assembly send data in every request 【发布时间】:2021-07-31 12:30:48 【问题描述】:

我正在使用 Blazor Web 程序集和 IdentityServer4 创建一个应用程序。 当用户登录时,选择一家公司,我存储它(我已经有了这部分),但我需要与控制器共享该公司(检查权限和对数据的访问)。

我该怎么做,或者我应该在每个请求中发送所选公司和用户?

【问题讨论】:

您需要显示更多代码示例,以便我们可以为您提供具体帮助,预先通过显示客户端如何解析选择的代码来帮助您。通常,如果存储了个性化或其他以用户或帐户为中心的数据,则服务器应该能够根据经过身份验证的用户检索该信息。如果选择更短暂,例如您不想永久存储它,那么您可以通过每个请求的 HTTP 标头将其传递回服务器。许多应用程序结合使用这些技术。请将您的帖子重新聚焦于这些概念中的任何一个。 【参考方案1】:

我对@9​​87654321@ 做了类似的事情。您需要将公司信息添加为声明。

    public class IdentityProfileService : IProfileService
    

        private readonly IUserClaimsPrincipalFactory<ApplicationUser> _claimsFactory;
        private readonly UserManager<ApplicationUser> _userManager;

        public IdentityProfileService(IUserClaimsPrincipalFactory<ApplicationUser> claimsFactory, UserManager<ApplicationUser> userManager)
        
            _claimsFactory = claimsFactory;
            _userManager = userManager;
        

        public async Task GetProfileDataAsync(ProfileDataRequestContext context)
        
            var sub = context.Subject.GetSubjectId();
            var user = await _userManager.FindByIdAsync(sub);
            if (user == null)
            
                throw new ArgumentException("User not found!",nameof(user));
            

            var principal = await _claimsFactory.CreateAsync(user);
            var claims = principal.Claims.ToList();

            //Add more claims like this
            //claims.Add(new System.Security.Claims.Claim("MyProfileID", user.Id));

            context.IssuedClaims = claims;
        

        public async Task IsActiveAsync(IsActiveContext context)
        
            var sub = context.Subject.GetSubjectId();
            var user = await _userManager.FindByIdAsync(sub);
            context.IsActive = user != null;
        
    

Startup.cs

var builder = services.AddIdentityServer(options =>

    ...
)
    .AddConfigurationStore<ConfigurationDbContext>(options =>
    
       ...
    )    
    .AddOperationalStore<PersistedGrantDbContext>(options =>
    
        ...
    )
    .AddAspNetIdentity<ApplicationUser>()
    .AddProfileService<IdentityProfileService>();   // <=========

【讨论】:

谢谢!我一直在寻找这样的东西,但对其进行测试......它不适合我需要的东西(所以我认为),用户应该能够从一家公司更改为另一家公司(如果获得多个授权),所以他应该能够在运行时更改声明,我还没有找到这样做的方法(我不知道是否可能) @Raykler 您可以为执行此操作的用户添加多个声明和登录页面......

以上是关于Blazor Web 程序集在每个请求中发送数据的主要内容,如果未能解决你的问题,请参考以下文章

如果多个用户同时在 Blazor 中发出请求会怎样?

CORS 策略已阻止访问 fetch - Blazor 客户端 Web 程序集

获取请求发送者的 URL

微信小程序如何发请求从web服务器获取数据

如何创建模块化 Blazor Web 应用程序

unity游戏退出发http