asp.net – 如何在没有查找AspNetUserRoles表的情况下获取WebAPI方法中的用户角色?
|
我有一个更新状态的存储过程。根据用户的角色,存储过程具有可能或可能不允许状态更改的代码。因此,我需要将角色名称传递给存储过程。我的角色名称存储在我的JavaScript代码的客户端上,但当然我需要在服务器上进行第二次检查。每个用户只有三个角色中的一个,当请求更新状态时,我可以根据客户端的角色调用三种方法之一。这是我试过的 我正在使用具有承载令牌的认证和ASP.NET Identity 2.1的WebApi,应用程序始终在浏览器中运行。我的用户已经设置了相应的角色。 我放置一些代码来获取userId,然后转到AspNetUserRoles表,以获取方法开始时的角色。但是我注意到这需要大约500毫秒才能运行。另外我正在考虑以下几点: [HttpPut]
[Authorize(Roles = "Admin")]
[Route("AdminUpdateStatus/{userTestId:int}/{userTestStatusId:int}")]
public async Task<IHttpActionResult> AdminUpdateStatus(int userTestId,int userTestStatusId)
{
return await UpdateStatusMethod(userTestId,userTestStatusId,"Admin");
}
[HttpPut]
[Authorize(Roles = "Student")]
[Route("StudentUpdateStatus/{userTestId:int}/{userTestStatusId:int}")]
public async Task<IHttpActionResult> StudentUpdateStatus(int userTestId,"Student");
}
[HttpPut]
[Authorize(Roles = "Teacher")]
[Route("TeacherUpdateStatus/{userTestId:int}/{userTestStatusId:int}")]
public async Task<IHttpActionResult> TeacherUpdateStatus(int userTestId,"Teacher");
}
private async Task<IHttpActionResult> UpdateStatusMethod(int userTestId,int userTestStatusId,string roleName)
{
// Call the stored procedure here and pass in the roleName
}
这是一个有效的方法来做到这一点,或者还有另一种更干净的方法。我不太清楚的是,如果前端或后端缓存用户角色。我认为这是完成或有一些设置将允许这样做。 注意我正在使用声明将角色信息发送给我的客户端: public static AuthenticationProperties CreateProperties(
string userName,ClaimsIdentity oAuthIdentity,string firstName,string lastName,int organization)
{
IDictionary<string,string> data = new Dictionary<string,string>
{
{ "userName",userName},{ "firstName",firstName},{ "lastName",lastName},{ "organization",organization.ToString()},{ "roles",string.Join(":",oAuthIdentity.Claims.Where(c=> c.Type == ClaimTypes.Role).Select(c => c.Value).ToArray())}
};
return new AuthenticationProperties(data);
}
但是,这里的问题与服务器有关,如果用户在不去数据库的情况下,我可以检查我的方法。也许有一种方法可以安全地使用声明,但我不知道如何做到这一点。 任何帮助和建议将不胜感激。 解决方法正如你所说,你正在使用承载令牌来保护你的终点。我相信,这些承载令牌魔术字符串中包含的内容很少有误会。那么这些令牌包含您发出令牌的用户的所有角色,以及如果您在Web API中使用默认数据保护DPAPI(JWT令牌),那么这些令牌被签名和加密,因此没有人可以篡改数据在令牌内,除非他有web服务器发出这个令牌的mashineKey,所以不要担心数据保护。 我的建议是从数据库中读取用户的角色/声明,您无需为此尝试解决此问题,所有您需要做的是在用户登录方法GrantResourceOwnerCredentials时为用户设置声明您可以这样设置,让用户从DB读取角色并将其设置为“Role”类型的声明 var identity = new ClaimsIdentity(context.Options.AuthenticationType); identity.AddClaim(new Claim(ClaimTypes.Name,context.UserName)); identity.AddClaim(new Claim(ClaimTypes.Role,"Admin")); identity.AddClaim(new Claim(ClaimTypes.Role,"Supervisor")); 记住,只有当用户登录时才会发生一次,那么您将收到包含所有这个用户声明的承载签名和加密令牌,不需要任何数据库访问来进行验证。 或者如果要从数据库创建身份,您可以使用以下内容: public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager,string authenticationType)
{
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this,authenticationType);
// Add custom user claims here
return userIdentity;
}
然后在GrantResourceOwnerCredentials中执行以下操作: ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(userManager,OAuthDefaults.AuthenticationType); 现在,一旦将承载令牌发送到具有Authorize(Authorize(Roles =“Teacher”)]的Authorize属性的受保护终端,我可以向您保证,您的代码将不会访问DB以执行任何查询,打开SQL分析器并检查它将从加密的令牌中读取声明以及角色声明,并检查此用户是否属于教师角色,并允许或拒绝请求。 我已经发布了一系列关于Token Based Authentication的5个帖子以及Authorization server和JWT tokens.我建议你阅读这些帖子来更好地了解持卡人的记号。 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – IIS 7.5 Web应用程序首先请求应用程序池回收非常
- asp.net-mvc – OpenID Connect的OWIN中间件 – 代码流(Flo
- ASP.NET实现的简单易用文件上传类
- asp.net-mvc – MVC应用程序的布局/设计模板?
- asp.net – Outputcache:VaryByHeader =“User-Agent”或V
- asp.net – JQGrid不显示数据
- asp.net-mvc – ASP.NET MVC – 模型可以有业务逻辑吗?
- asp.net – System.Web.UI.ViewStateException,无效的views
- asp.net – w3wp.exe占用多少内存
- 有没有任何好的ASP.NET MVC2或MVC3作弊表?
- .net – 包恢复失败.回滚包更改 – Serilog.AspN
- asp.net-mvc-2 – Plus()在MVC中的参数引起404在
- ASP.NET代码隐藏中的当前工作目录 – 我们可以依
- asp.net-mvc – 使用AD的ASP.NET MVC表单Auth在本
- asp.net-mvc – 何时使用asp.net mvc的路由规则v
- asp.net-mvc-4 – 在ASP.NET MVC4 WebAPI中实现E
- asp.net – 我可以在ASMX JSON服务上设置HTTP响应
- ASP.NET MVC中%:和%=有什么区别?
- asp.net-mvc – 在Asp.net MVC中导出到Excel [已
- asp.net-ajax – ASP.Net AJAX UpdatePanel无法触
