我的应用程序是用.net core MVC编写的,c#。 一旦用户登录到应用程序,在成功进行身份验证后,我将从数据库中获取登录用户的声明,如下所示。
public async Task<IActionResult> Login(LoginInputViewModel model)
{
if (ModelState.IsValid)
{
//do authentication here
//Once user is authenticated then go to next step
//Below is the authorization part
var userPermission = //getting all the permission from db
List<Claim> claims = new List<Claim>();
foreach (var user in userPermission)
{
claims.Add(new Claim("Permission", user.Permission));
claims.Add(new Claim("FirstName", user.FirstName));
claims.Add(new Claim("LastName", user.LastName));
}
// create identity
ClaimsIdentity identity = new ClaimsIdentity(claims, "cookie");
// create principal
ClaimsPrincipal principal = new ClaimsPrincipal(identity);
await HttpContext.SignInAsync(principal);
}
else
{
this.ModelState.AddModelError(string.Empty, "Invalid credentials.");
return this.View(inputModel);
}
}
我的基本控制器也是:
public class BaseController : Controller
{
public User LoggedInUser
{
get
{
return new User(this.User as ClaimsPrincipal);
}
}
}
我没有显示所有代码但是上面用户返回我的所有声明,即FirstName,LastName&amp;许可
我在家里使用这个基本控制器:
public class HomeController : BaseController
{
}
我想在我的应用程序上设置授权。我已经获得了我的声明的许可(返回读取或写入权限)。基于这些权限,我想在我的视图中隐藏某些控件。我怎样才能做到这一点。或者因为我已经在基本控制器中的User中有我的声明,我如何在我的视图中访问它。或者是否有更好的方法来授权视图控件。
欣赏投入。 感谢。
答案 0 :(得分:1)
1)您可以使用授权属性和claims-based authorization
在ConfigureServices中添加策略
services.AddAuthorization(options =>
{
options.AddPolicy("FullAccessOnly", policy => policy.RequireClaim("FullAccess"));
});
在您的控制器中使用此政策
public IActionResult SomePage()
{
return View();
}
[Authorize(Policy = "FullAccessOnly")]
public IActionResult SomePageWithFullAccess()
{
return View();
}
2)或者您可以使用一种方法来检查声明并使用FullAcess属性准备viewmodel
3)或查看您的声明
@{
var fullaccess = User.Claims.Where(x => x.Type == "Permission").FirstOrDefault().Value == "RW" ? true : false;
}
@if(fullaccess){
//interface with fullacess
} else {
//interface with RO access
}