我的edu-site(服务器托管)有一个多人游戏的集合,我希望未注册的用户能够尝试。街上的路人将收到带有二维码的海报,无需注册即可直接进入游戏区。
玩家必须在进入页面时选择并自定义头像和临时名称,然后才能选择加入游戏。但如果他们重新加载或超时,他们就会退出,并且必须重新创建一个新头像。这可能会导致你立即失去兴趣,并可能失去一个客户。
我的问题:如何在未登录的来宾用户重新加载时最好地保持状态。
我在想:
- 每个电路的日志IP地址,在重新加载时弹出:"这个IP目前在一个注册的游戏中。重新加入?">
- 创建临时用户并登录,然后在游戏结束后删除临时用户
- 使用cookie但不创建任何用户对象
有什么好主意吗?唯一绝对不能去的是,我不想强迫用户填写任何类型的注册表格。在他们尝试了一些游戏后,他们将有机会这样做。
好的,这原来是一个很好的机会,了解中间件在Blazor。
老实说,我很惊讶居然这么简单。在请求到达Blazor引擎之前,您就可以访问HTTPContext、. net成员方法和您需要的所有其他内容。如果没有UserID的user
,下面的代码将拦截为games
页面提供服务的请求,创建一个前缀为&;guest_&;的新用户,并将该用户登录到该帐户,然后将其释放给管道的其余部分。
GuesIDMiddleware.cs
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Identity;
using System;
using System.Threading.Tasks;
namespace APP.Code.Gaming
{
public class GuestIdMiddleware
{
private readonly RequestDelegate _next;
public async Task Invoke (HttpContext context, UserManager<IdentityUser> _userManager, SignInManager<IdentityUser> _signInManager)
{
var UserID = context.User.FindFirst(c => c.Type.Contains("nameidentifier"))?.Value;
if (context.Request.Path.Value == "/games" && UserID is null)
{
var user = new IdentityUser { UserName = "guest_" + Guid.NewGuid(), Email = "guest@beclub.kr", EmailConfirmed = true };
var result = await _userManager.CreateAsync(user, Guid.NewGuid().ToString());
if (result.Succeeded)
await _signInManager.SignInAsync(user, isPersistent: true);
}
await _next.Invoke(context);
}
public GuestIdMiddleware(RequestDelegate next)
{
_next = next;
}
}
}
,字面上只需要在System.cs
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// . . .
app.UseAuthentication();
app.UseAuthorization();
app.UseMiddleware<GuestIdMiddleware>();
// . . .
}