C# Web API-JWT-匿名访问的默认用户

C# Web API-JWT-匿名访问的默认用户,c#,authentication,asp.net-web-api,jwt,C#,Authentication,Asp.net Web Api,Jwt,我正在使用Web API和JSON Web令牌建立一个站点。然而,该网站的一部分是开放的匿名访问,因此最终用户可以提交各种问题/答案的信息。一切正常,但我想防止恶意用户篡改他人正在提交的内容 为每个匿名用户提供在声明集合中具有随机哈希值的“默认”用户是否有助于防止这种情况?然后,当与数据库交互时,通过将哈希用作查询条件的一部分,可以将哈希与传入的任何请求进行比较 public class CustomOAuthProvider : OAuthAuthorizationServerProvider

我正在使用Web API和JSON Web令牌建立一个站点。然而,该网站的一部分是开放的匿名访问,因此最终用户可以提交各种问题/答案的信息。一切正常,但我想防止恶意用户篡改他人正在提交的内容

为每个匿名用户提供在声明集合中具有随机哈希值的“默认”用户是否有助于防止这种情况?然后,当与数据库交互时,通过将哈希用作查询条件的一部分,可以将哈希与传入的任何请求进行比较

public class CustomOAuthProvider : OAuthAuthorizationServerProvider
{
    public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
    {
        context.Validated();
        return Task.FromResult<object>(null);
    }

    public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {
        var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>();

        ApplicationUser user;
        if ((string.IsNullOrWhiteSpace(context.UserName) || context.UserName.ToLower() == "undefined") 
            && (string.IsNullOrWhiteSpace(context.Password) || context.Password.ToLower() == "undefined"))
        {
            user = await userManager.FindAsync(@"guest", @"somePassword");
        }
        else
        {
            user = await userManager.FindAsync(context.UserName, context.Password);
        }

        if (user == null)
        {
            context.SetError("invalid_grant", "The user name or password is incorrect.");
            return;
        }

        var oAuthIdentity = await user.GenerateUserIdentityAsync(userManager, "JWT");
        var ticket = new AuthenticationTicket(oAuthIdentity, null);            
        context.Validated(ticket);
    }
}
公共类CustomOAuthProvider:OAuthAuthorizationServerProvider
{
公共覆盖任务ValidateClientAuthentication(OAuthValidateClientAuthenticationContext)
{
context.Validated();
返回Task.FromResult(空);
}
公共重写异步任务GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentials上下文)
{
var userManager=context.OwinContext.GetUserManager();
应用程序用户;
if((string.IsNullOrWhiteSpace(context.UserName)| | context.UserName.ToLower()=“未定义”)
&&(string.IsNullOrWhiteSpace(context.Password)| | context.Password.ToLower()=“未定义”))
{
user=wait userManager.FindAsync(@“guest”,@“somePassword”);
}
其他的
{
user=await userManager.FindAsync(context.UserName,context.Password);
}
if(user==null)
{
SetError(“无效的授权”,“用户名或密码不正确”);
返回;
}
var oAuthIdentity=await user.GenerateUserIdentityAsync(userManager,“JWT”);
var票证=新的身份验证票证(oAuthIdentity,null);
上下文。已验证(票证);
}
}
在匿名用户的声明集合中设置ClaimTypes.Hash值,以便随每个后续请求一起传递

public class ApplicationUser : IdentityUser
{
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager, string authenticationType)
    {
        var userIdentity = await manager.CreateIdentityAsync(this, authenticationType);

        if (!userIdentity.HasClaim(x => x.Type == ClaimTypes.Hash))
        {
            var bytes = new byte[16];
            using (var rng = new RNGCryptoServiceProvider())
            {
                rng.GetBytes(bytes);
                userIdentity.AddClaim(new System.Security.Claims.Claim(ClaimTypes.Hash, BitConverter.ToString(bytes).Replace("-", "").ToLower()));
            }
        }

        return userIdentity;
    }
}
公共类应用程序用户:IdentityUser
{
公共异步任务GenerateUserIdentityAsync(UserManager管理器,字符串身份验证类型)
{
var userIdentity=wait manager.CreateIdentityAsync(这是authenticationType);
if(!userIdentity.HasClaim(x=>x.Type==ClaimTypes.Hash))
{
var字节=新字节[16];
使用(var rng=new RNGCryptoServiceProvider())
{
rng.GetBytes(字节);
userIdentity.AddClaim(新的System.Security.Claims.Claims(Claims.Hash,BitConverter.ToString(bytes).Replace(“-”,”).ToLower());
}
}
返回用户身份;
}
}

这种方法和/或更好的替代方案是否存在任何问题?

恶意用户如何篡改正在进行的提交?因为每个用户都将使用相同的“来宾”帐户,所以每个用户需要做的只是更改请求URL和/或有效负载中的ID,并且他们可能会发送一篇帖子以进行另一次提交。我原本打算使用提交ID的GUID来最小化这种风险,但目前正在使用整数。