C# Web API-JWT-匿名访问的默认用户
我正在使用Web API和JSON Web令牌建立一个站点。然而,该网站的一部分是开放的匿名访问,因此最终用户可以提交各种问题/答案的信息。一切正常,但我想防止恶意用户篡改他人正在提交的内容 为每个匿名用户提供在声明集合中具有随机哈希值的“默认”用户是否有助于防止这种情况?然后,当与数据库交互时,通过将哈希用作查询条件的一部分,可以将哈希与传入的任何请求进行比较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
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来最小化这种风险,但目前正在使用整数。