FormsAuthenticationTicket
yapıcı (çoğu parametrelerle bir) bir dize alır userData
parametresi vardır. Buradaki rollerinizi, boru (|) veya karma gibi bir karakterle ayırarak ekleyebilirsiniz. Kullanmayı planladığın şey sana kalmış. Normalde yaptığınız şey, AuthenticateRequest
etkinliğini kaydetmektir. Böyle bir şey yapacağını global.asax
yılında Bundan sonra
private void CreateTicket()
{
var ticket = new FormsAuthenticationTicket(
version: 1,
name: UserName,
issueDate: DateTime.Now,
expiration: DateTime.Now.AddSeconds(httpContext.Session.Timeout),
isPersistent: false,
userData: String.Join("|", arrayOfRoles));
var encryptedTicket = FormsAuthentication.Encrypt(ticket);
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
httpContext.Response.Cookies.Add(cookie);
}
: Yani, bu bir bilet yaratabilecek
public override void Init()
{
base.AuthenticateRequest += OnAuthenticateRequest;
}
private void OnAuthenticateRequest(object sender, EventArgs eventArgs)
{
if (HttpContext.Current.User.Identity.IsAuthenticated)
{
var cookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
var decodedTicket = FormsAuthentication.Decrypt(cookie.Value);
var roles = decodedTicket.UserData.Split(new[] {"|"}, StringSplitOptions.RemoveEmptyEntries);
var principal = new GenericPrincipal(HttpContext.Current.User.Identity, roles);
HttpContext.Current.User = principal;
}
}
Şimdi IPrincipal nesnesinde rolleri (HttpContext.Current.User
) varsa ve birlikte sorguladığınızda HttpContext.Current.User.IsUserInRole("RoleName")
Doğru veya yanlış alacaksınız. Bu şekilde Roles
sağlayıcısını kullanmamanız gerekir.
GÜNCELLEME: Yeniden oluşturma işleminin başlaması için aranacak daha iyi bir olay Kullanıcı yöneticisi, BeginRequest
yerine Application_AuthenticateRequest
şeklindedir. Kodu yansıtacak şekilde güncelledim.
Roller ile çalışmak için şimdi hangi mekanizmayı kullanıyorsunuz? –
@HuseinRoncevic Veritabanı tablomda UserName, Password ve User için Kullanıcı Rolü var. Veritabanı tablosundan alınan Rolü Kimlik Doğrulama biletine iletmek istiyorum – chamara
Bu şekilde çalıştığından emin değil. Kullanıcı adını yalnızca auth çerezine koydunuz ve her gelen istek için auth cookie'den kullanıcı adını okuyor ve diğer detayları veritabanından yüklüyorsunuz. Bu bir ActionFilter'da yapılabilir. – Suhas