Проверка подлинности с помощью форм не поддерживает роли сама по себе.Таким образом, вам нужно установить запрос IPrincipal
с ролями вручную .Вы можете сделать это, подписавшись на событие post authenticate в Global.asax
и обновив информацию о зарегистрированном пользователе.Добавьте следующий метод внутри MvcApplication
класса в Global.asax.cs
protected void Application_OnPostAuthenticateRequest(object sender, EventArgs e)
{
HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie != null)
{
//get the forms authentication ticket
FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
string userData = authTicket.UserData;
//here we suppose userData contains roles joined with ","
string[] roles = userData.Split(',');
//at this point we already have Context.User set by forms authentication module
//we don't change it but add roles
var principal = new GenericPrincipal(Context.User.Identity, roles);
// set new principal with roles
Context.User = principal;
}
}
Также вам необходимо обновить код для входа в систему, чтобы создать правильный FormsAuthenticationTicket
содержащий роли, соединенные с ","
var roles = user.Roles.Select(c => c.Nome);
var ticket = new FormsAuthenticationTicket(
1,
user.Id.ToString(),
DateTime.Now,
DateTime.Now.AddDays(5),
model.RememberMe,
string.Join(",", roles), //or you can serialize complex class as json or whatever
FormsAuthentication.FormsCookiePath
);
Другой вариант - переопределить аутентификацию форм , добавив метод FormsAuthentication_OnAuthenticate
в Global.asax.cs
public void FormsAuthentication_OnAuthenticate(object sender, FormsAuthenticationEventArgs args)
{
if (FormsAuthentication.CookiesSupported)
{
HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie != null)
{
try
{
//get the forms authentication ticket
FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
string userData = authTicket.UserData;
//here we suppose userData contains roles joined with ","
string[] roles = userData.Split(',');
//we have to create identity since it's not created yet
var identity = new FormsIdentity(authTicket);
var principal = new GenericPrincipal(identity, roles);
args.User = principal;
}
catch (Exception e)
{
// Decrypt method failed.
}
}
}
else
{
throw new HttpException("Cookieless Forms Authentication is not " +
"supported for this application.");
}
}
Оба решения очень похожи, поэтому вы можете выбрать одно.