Пользовательские роли в ASP.NET - PullRequest
2 голосов
/ 01 мая 2010

Я работаю над веб-сайтом ASP.NET, который использует проверку подлинности с помощью специального механизма проверки подлинности (который e.Authenticated программно устанавливает protected void Login_Authenticate(object sender, AuthenticateEventArgs e)).

У меня есть карта сайта ASP.NET. Некоторые элементы должны отображаться только для зарегистрированных пользователей. Другие должны отображаться только одному уникальному пользователю (то есть администратору, идентифицированному по имени пользователя, которое никогда не изменится).

Чего я хочу избежать:

  • Установить пользовательский поставщик ролей: слишком много кода для такой простой вещи,
  • Преобразуйте существующий код, например, удалив карту сайта и заменив ее решением с выделенным кодом.

Что я хочу сделать:

  • Чистое решение с выделением кода, которое позволит мне назначать роли для события проверки подлинности.

Возможно ли это? Как? Если нет, то есть ли простой способ сделать это?

Ответы [ 2 ]

4 голосов
/ 01 мая 2010

Как говорит Мэтью, создание принципала и его установка в нужный момент - это самый простой способ воспользоваться всеми встроенными функциями на основе ролей, такими как 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
}
2 голосов
/ 01 мая 2010

Я использую эту технику, которую рекомендует Microsoft:

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

В глобальном asax я перехватываю куки-файл auth, а затем устанавливаю принцип потока и пользователя HttpContext и роли для него. После того, как вы можете использовать HttpContext.Current.User.IsInRole ("foo"), который является почти таким же кодом, который вы использовали бы в эквивалентном WinForm.

Чем больше вы можете положиться на встроенные шаблоны, тем выше вероятность того, что они будут безопасными, и тем более вероятно, что разработчик обслуживания поймет, как использовать шаблон.

...