IsInRole() khusus saat menggunakan Cookie Middleware tanpa Identitas ASP.NET

Untuk menjaga kompatibilitas dengan aplikasi yang ada, saya berencana menggunakan Cookie Middleware tanpa Identitas ASP.NET, seperti yang dijelaskan dalam dokumentasi:

https://docs.asp.net/en/latest/security/authentication/cookie.html

Ini tampaknya berfungsi seperti yang diharapkan saat memasukkan pengguna, tetapi saya mengalami masalah dengan peran -- khususnya saat menggunakan [Authorize(Roles = "ADMIN")].

Dalam kode di bawah ini, saya dapat memanggil p.IsInRole("ADMIN") dan implementasi MyClaimsPrincipal.IsInRole() saya dipanggil dan mengembalikan nilai true.

Yang tidak berfungsi adalah atribut [Authorize(Roles = "ADMIN")] karena akhirnya memanggil ClaimsPrincipal.IsInRole (yang mengembalikan False) alih-alih MyClaimsPrincipal.IsInRole() (yang mengembalikan True).

[Authorize(Roles = "ADMIN")]
public class MyAdminController : Controller
{
    public IActionResult Index()
    {
        var p = new MyClaimsPrincipal(ClaimsPrincipal.Current);

        bool isAdmin = p.IsInRole("ADMIN");

        return View();
    }
}
  1. Saat tidak menggunakan Identity dan hanya menggunakan Cookie Middleware, dapatkah saya menggunakan atribut [Authorize(Roles = "ADMIN")]?

  2. Bagaimana? :-)

Jika saya harus menebak, saya tidak menerapkan p.IsInRole() dengan benar -- saat ini metode ini memuat peran, lalu mengembalikan Benar/Salah. Mungkin saya harus 'memuat' peran saya di tempat lain sedemikian rupa sehingga ClaimsPrincipal.IsInRole sudah cukup. Jika saya menggunakan Identity(), saya berasumsi ini akan menjadi implementasi dari IUserRoleStore.

Jawaban 'jika saya harus menebak' saya yang lain adalah di suatu tempat di startup.cs saya perlu mengganti ClaimsPrincipal saat ini dengan instance MyClaimsPrincipal.

Terima kasih!


person Robert Paulsen    schedule 03.05.2016    source sumber


Jawaban (1)


Anda harus menambahkan klaim peran saat cookie dibuat.

Di startup.cs:

app.UseCookieAuthentication(options =>
{
     options.AuthenticationScheme = "MyCookieMiddlewareInstance";
     options.LoginPath = new PathString("/Account/Login/");
     options.AccessDeniedPath = new PathString("/Account/Forbidden/");
     options.AutomaticAuthenticate = true;
     options.AutomaticChallenge = true;
 });

Dan metode posting login mungkin seperti ini (saya berasumsi Anda memiliki halaman login khusus):

[HttpPost]
public IActionResult Login(string userName, string password, string returnUrl)
{
     var user = _userService.GetUser(userName, password);// i assume that  _userService is injected
     if (user == null)
     {
          //return Error;
     }
     var claims = new List<Claim>()
     {
          new Claim(ClaimTypes.NameIdentifier, user.Id),
          new Claim(ClaimTypes.Name, user.GetFullName() ),
     };
     var identity = new ClaimsIdentity(claims, "Forms");
     identity.AddClaim(new Claim(ClaimTypes.Role, "ADMIN"));
     var principal = new ClaimsPrincipal(identity);

     HttpContext.Authentication.SignInAsync("MyCookieMiddlewareInstance", principal);
     return Redirect(returnUrl);
}
person adem caglin    schedule 03.05.2016