根据用户声明切换MVC视图控件

时间:2017-10-31 12:46:25

标签: asp.net-core authorization asp.net-core-mvc

我的应用程序是用.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中有我的声明,我如何在我的视图中访问它。或者是否有更好的方法来授权视图控件。

欣赏投入。 感谢。

1 个答案:

答案 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
}