Questions tagged «single-page-application»

3
SPA认证和会话管理最佳实践
使用Angular,Ember,React等框架构建SPA风格的应用程序时,人们认为什么是身份验证和会话管理的最佳实践?我可以考虑考虑解决该问题的几种方法。 假定API和UI具有相同的原始域,则对待它与使用常规Web应用程序进行身份验证没有区别。 这可能涉及到具有会话cookie,服务器端会话存储以及可能经过身份验证的Web UI可以访问以获取当前用户信息以帮助进行个性化甚至可能确定客户端角色/功能的某些会话API端点。服务器当然仍然会执行保护访问数据的规则,UI只会使用此信息来定制体验。 像使用公共API的任何第三方客户端一样对待它,并使用类似于OAuth的某种令牌系统进行身份验证。客户端UI将使用此令牌机制来验证对服务器API的每个请求。 我在这里并不是真正的专家,但是对于大多数情况来说,#1似乎已经足够了,但是我真的很想听听一些更有经验的意见。


11
单页应用程序:优点和缺点[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引文回答。 3年前关闭。 改善这个问题 我已经读过SPA及其优势。我发现其中大多数令人信服。有3个优点引起了我的怀疑。 问题: 您可以担任SPA的拥护者,并证明我对前三个陈述有误吗? === ADVANTAGES === 1. SPA对于响应速度很快的网站非常有用: 对于所有中间状态,很难实现服务器端呈现-小视图状态无法很好地映射到URL。 单页应用程序的特点是能够重绘UI的任何部分,而无需服务器往返来检索HTML。这是通过具有处理数据的模型层和从模型读取的视图层将数据与数据表示分离开来的。 为非SPA保留模型层有什么问题?SPA是否是客户端上唯一与MVC兼容的体系结构? 2.使用SPA,我们不需要对服务器使用额外的查询来下载页面。 嗯,在访问您的网站期间用户可以下载多少页?二三?而是出现了另一个安全问题,您需要将登录页面,管理页面等分成单独的页面。反过来,它与SPA架构冲突。 3.可能还有其他优势吗?什么都没听到 === DISADVANTAGES === 客户端必须启用javascript。 该站点只有一个入口点。 安全。 PS我曾经从事过SPA和非SPA项目。我问这些问题是因为我需要加深理解。无意伤害SPA支持者。不要让我多读一些有关SPA的文章。我只想听听您对此的考虑。

5
如何使SPA SEO可抓取?
我一直在研究如何根据Google的说明使SPA可被Google抓取。即使有很多一般性的解释,我也找不到任何包含实际示例的更详尽的分步教程。完成此操作后,我想分享我的解决方案,以便其他人也可以使用它,并可能进一步改进它。 我使用MVC与Webapi控制器和Phantomjs在服务器端,并迪朗达尔与客户端push-state启用; 我还使用Breezejs进行客户端-服务器数据交互,我强烈建议所有这些操作,但是我将尝试给出足够概括的解释,这也将有助于使用其他平台的人们。

2
使用无状态(=无会话)身份验证时需要CSRF令牌吗?
当应用程序依赖无状态身份验证(使用HMAC之类的东西)时,是否有必要使用CSRF保护? 例: 我们只有一个页面应用程序(否则,我们必须在每个链接上附加令牌:<a href="...?token=xyz">...</a>。 用户使用进行身份验证POST /auth。成功认证后,服务器将返回一些令牌。 令牌将通过JavaScript存储在单页应用程序内的某个变量中。 该令牌将用于访问受限制的URL,例如/admin。 令牌将始终在HTTP标头中传输。 没有Http会话,也没有Cookie。 据我了解,应该不会(?!)使用跨站点攻击,因为浏览器不会存储令牌,因此它无法自动将令牌发送到服务器(使用Cookies /时会发生这种情况。会话)。 我想念什么吗?


1
如何在使用Http.sys和URLPrefix时配置dotnet core 3来提供React SPA?
更改URLPrefix后,出现以下错误: SPA默认页面中间件无法返回默认页面'/index.html',因为找不到默认页面,并且没有其他中间件处理该请求。 因此,需要一些信息来告诉dotnet core有关前缀的信息,但是我似乎找不到正确的设置组合。 帮助非常感谢。 代码如下: HostBuilder的设置: public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseHttpSys(options => { options.AllowSynchronousIO = false; options.Authentication.Schemes = AuthenticationSchemes.None; options.Authentication.AllowAnonymous = true; options.MaxConnections = null; options.MaxRequestBodySize = 30000000; options.UrlPrefixes.Add("http://localhost:5005/Product/Site"); }); webBuilder.UseStartup<Startup>(); }); ConfigureServices: public override void ConfigureServices(IServiceCollection services) { services.AddRazorPages(); services.AddSpaStaticFiles(configuration => { …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.