Как говорит Мэтью, создание принципала и его установка в нужный момент - это самый простой способ воспользоваться всеми встроенными функциями на основе ролей, такими как SiteMap.
Но есть гораздо более простой метод реализации, основанный на стандартах, чем показано в MSDN.
Вот так я реализую простой поставщик ролей
Global.asax
using System;
using System.Collections.Specialized;
using System.Security.Principal;
using System.Threading;
using System.Web;
using System.Web.Security;
namespace SimpleRoles
{
public class Global : HttpApplication
{
private static readonly NameValueCollection Roles =
new NameValueCollection(StringComparer.InvariantCultureIgnoreCase)
{
{"administrator", "admins"},
// note, a user can be in more than one role
{"administrator", "codePoets"},
};
protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
HttpCookie cookie = Request.Cookies[FormsAuthentication.FormsCookieName];
if (cookie != null)
{
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value);
Context.User = Thread.CurrentPrincipal =
new GenericPrincipal(Context.User.Identity, Roles.GetValues(ticket.Name));
}
}
}
}
Чтобы вручную проверить пользователя в контексте кодовой страницы:
if (User.IsInRole("admins"))
{
// allow something
}
В другом месте просто отключите пользователя от текущего контекста
if (HttpContext.Current.User.IsInRole("admins"))
{
// allow something
}