我有一个存储过程用于更新状态。根据用户的角色,该存储过程可能允许或不允许更改状态。因此,我需要将角色名称传递给存储过程。我的角色名称存储在客户端的JavaScript代码中,但是当然我需要在服务器上进行第二次检查。每个用户仅具有三个角色中的一个,当请求更新状态时,我可以根据客户端所拥有的角色调用其中一个方法。这是我尝试的:
我正在使用基于Bearer Token的认证的WebApi和ASP.NET Identity 2.1,应用程序始终在浏览器中运行。我的用户已设置了适当的角色。
我编写了一些代码来获取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, int userTestStatusId)
{
return await UpdateStatusMethod(userTestId, userTestStatusId, "Student");
}
[HttpPut]
[Authorize(Roles = "Teacher")]
[Route("TeacherUpdateStatus/{userTestId:int}/{userTestStatusId:int}")]
public async Task<IHttpActionResult> TeacherUpdateStatus(int userTestId, int userTestStatusId)
{
return await UpdateStatusMethod(userTestId, userTestStatusId, "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);
}
然而,我的问题与服务器有关,我在方法中如何检查用户是否具有特定角色而不必访问数据库。也许有一种安全的方法可以使用声明来实现,但我不知道如何做到这一点。
非常感谢任何帮助和建议。