2012-11-15 7 views
8

W mojej aplikacji ASP.NET MVC 4 używam szablonu intranetu do implementacji uwierzytelniania systemu Windows. Używam także Fluent Security.Jak można wykorzystać grupy domeny jako role z płynnymi zabezpieczeniami w ASP.NET MVC 4?

Po wyjęciu z pudełka mogę użyć adnotacji pokazanych poniżej, aby ograniczyć dostęp do metod kontrolera do określonych grup domen lub użytkowników domeny.

[Authorize([email protected]"Domain\GroupName")] 
public ActionResult Index() 
{ 
    ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application."; 

    return View(); 
} 

[Authorize([email protected]"Domain\UserName")] 
public ActionResult About() 
{ 
    ViewBag.Message = "Your app description page."; 

    return View(); 
} 

W jaki sposób ograniczyć te dwie metody do tej samej grupy domeny i użytkownika domeny przy użyciu Fluent Security? Jestem bardziej zainteresowany grupą niż użytkownikiem, jeśli jest to łatwiejsze. Czy muszę utworzyć niestandardową zasadę? Jeśli tak, to nie jestem do końca pewien, w jaki sposób sprawdzić, czy uwierzytelniony użytkownik znajduje się w grupie domeny, aby zwrócić odpowiednią rolę do korzystania z Fluent Security?

Rozpocząłem już prace nad FluentSecurity, więc wiem, w jaki sposób można wdrożyć FluentSecurity. Po prostu nie wiem, jak używać Grup Domen jako ról.

Dzięki!

Odpowiedz

3

Możliwe, że znalazłem sposób na użycie grup domeny dla ról. Zmieniono rozszerzony przykład na stronie Rozpoczęcie pracy nad bezpieczeństwem.

W Global.asax.cs:

SecurityConfigurator.Configure(configuration => 
{ 
    // Let Fluent Security know how to get the authentication status of the current user 
    configuration.GetAuthenticationStatusFrom(() => HttpContext.Current.User.Identity.IsAuthenticated); 

    // Let Fluent Security know how to get the roles for the current user 
    configuration.GetRolesFrom(System.Web.Security.Roles.GetRolesForUser); 

    // This is where you set up the policies you want Fluent Security to enforce 
    configuration.For<HomeController>().Ignore(); 

    configuration.For<AccountController>().DenyAuthenticatedAccess(); 
    configuration.For<AccountController>(x => x.ChangePassword()).DenyAnonymousAccess(); 
    configuration.For<AccountController>(x => x.LogOff()).DenyAnonymousAccess(); 

    configuration.For<BlogController>(x => x.Index()).Ignore(); 
    configuration.For<BlogController>(x => x.AddPost()).RequireRole(@"Domain\Writers"); 
    configuration.For<BlogController>(x => x.AddComment()).DenyAnonymousAccess(); 
    configuration.For<BlogController>(x => x.DeleteComments()).RequireRole(@"Domain\Writers"); 
    configuration.For<BlogController>(x => x.PublishPosts()).RequireRole(@"Domain\Owners"); 

    // To authorize the Home Controller Index Action as in my original question 
    configuration.For<HomeController>(c => c.Index()).RequireRole(@"Domain\GroupName"); 
}); 

GlobalFilters.Filters.Add(new HandleSecurityAttribute(), 0); 

w pliku web.config:

<authentication mode="Windows" /> 
<authorization> 
    <deny users="?" /> 
</authorization> 
<roleManager defaultProvider="WindowsProvider" 
     enabled="true" 
     cacheRolesInCookie="false"> 
    <providers> 
    <add 
     name="WindowsProvider" 
     type="System.Web.Security.WindowsTokenRoleProvider" /> 
    </providers> 
</roleManager> 

nie znalazłem sposobu zezwalania jednemu użytkownikowi, ale wszyscy wiemy, że jest ogólnie najlepsza praktyka korzystania z grup mimo to.

Czy istnieją lepsze sposoby na zrobienie tego?

Powiązane problemy