正如 Matthew 所说,建立一个主体并在适当的时候自己设置它是利用所有内置的基于角色的好东西(如 SiteMap)的最简单方法。
但是有一个比 MSDN 显示的更简单的基于标准的实现方法。
这就是我实现简单角色提供者的方式
全球.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));
}
}
}
}
要在 Page 代码隐藏的上下文中手动检查用户:
if (User.IsInRole("admins"))
{
// allow something
}
在其他地方只是让用户离开当前上下文
if (HttpContext.Current.User.IsInRole("admins"))
{
// allow something
}