2

我正在开发一个 ASP.NET 网站,该网站使用带有自定义身份验证机制的表单身份验证(以e.Authenticated编程方式设置为 on protected void Login_Authenticate(object sender, AuthenticateEventArgs e))。

我有一个 ASP.NET 站点地图。某些元素必须仅对登录用户显示。其他必须只显示给一个唯一的用户(即管理员,由永远不会更改的用户名标识)。

我想避免的:

  • 设置自定义角色提供者:为这样一个基本的东西编写太多代码,
  • 转换现有代码,例如通过删除站点地图并将其替换为代码隐藏解决方案。

我想做的事:

  • 一个纯代码隐藏解决方案,可以让我在身份验证事件上分配角色。

是否可以?如何?如果没有,是否有简单的解决方法?

4

2 回答 2

4

正如 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
}
于 2010-05-01T14:46:17.600 回答
2

我使用微软推荐的这种技术:

http://msdn.microsoft.com/en-us/library/aa302399.aspx

在全局 asax 中我截取了 auth cookie,然后设置线程原理和 HttpContext 用户和角色相同。在您可以使用 HttpContext.Current.User.IsInRole("foo") 之后,这与您在 WinForm 等效项中使用的代码非常相似。

您可以越多地依赖内置模式,它就越有可能是安全的,维护开发人员就越有可能认识到如何使用该模式。

于 2010-05-01T14:14:26.847 回答