Расширение проверки подлинности Windows в ASP.NET MVC 3 Application

после долгих поисков в Google и чтения нескольких решений о том, как управлять аутентификацией в смешанном режиме в приложениях ASP.NET, у меня все еще нет подходящего решения для моей проблемы.

Мне нужно реализовать приложение интрасети для множества различных групп пользователей. До сих пор я использовал аутентификацию Windows, которую было очень просто реализовать. Мои проблемы возникают, когда дело доходит до авторизации групп пользователей для специальных функций приложения.

Использование [Authorize (Users = "DOMAIN \\ USER")] отлично работает, но из-за того, что у меня нет доступа к управлению Active Directory, я не могу настроить управление ролями таким образом Мне это нужно для моего приложения.

Я бы хотел определить пользовательские роли и членство в дополнение к тем, которые определены в активном каталоге (возможно ли такое расширение? Например, путем реализации собственного провайдера membershipprovider?).

Как вы думаете, лучшее решение моей проблемы. Действительно ли мне нужно реализовать сложную аутентификацию в смешанном режиме с аутентификацией с помощью форм в дополнение к аутентификации Windows?

Используемые технологии:

  • MS SQL Server 2008
  • MS VS 2010
  • ASP.NET MVC 3 - Razor View Двигатель
  • Telerik Extensions для ASP.NET MVC
  • IIS 7 в Windows Server 2008

РЕДАКТИРОВАТЬ (окончательное решение благодаря помощи dougajmcdonald):

Указав мне использовать настраиваемую реализацию IPrincipal, я нашел несколько решений здесь и здесь . Собрав все вместе, я пришел к следующему решению:

1. Создать собственную реализацию принципала:

public class MyPrincipal: WindowsPrincipal
{
    List _roles;

    public MyPrincipal(WindowsIdentity identity) : base(identity) {
        // fill roles with a sample string just to test if it works
        _roles = new List{"someTestRole"}; 
        // TODO: Get roles for the identity out of a custom DB table
    }

    public override bool IsInRole(string role)
    {
        if (base.IsInRole(role) || _roles.Contains(role))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

2. Интегрировать мою собственную реализацию принципала в приложение путем расширения файла «Global.asax.cs»:

    protected void Application_AuthenticateRequest(object sender, EventArgs e)
    {
        if (Request.IsAuthenticated)
        {
            WindowsIdentity wi = (WindowsIdentity)HttpContext.Current.User.Identity;
            MyPrincipal mp = new MyPrincipal(wi);
            HttpContext.Current.User = mp;
        }
    }

3 .Использовать мои пользовательские роли для авторизации в моем приложении

public class HomeController : Controller
{
    [Authorize(Roles= "someTestRole")]
    public ActionResult Index()
    {
        ViewBag.Message = "Welcome to ASP.NET MVC!";

        return View();
    }
}

Работает !!! Ага!

14
задан tereško 30 July 2012 в 16:00
поделиться