2010-11-06 3 views
0

Я использую следующий код для управления доступом в приложении ASP.MVC (это часть контроллера):в приложении ASP.MVC

public ActionResult MakeEditable(int id) 
{ 
    // controlling part 
    if (!User.Identity.IsAuthenticated) 
    { 
     return RedirectToAction("Login", "User", new { 
      callback = Url.Action("MakeEditable", "Article", new { id = id }) 
     }); 
    } 

    // action's body 
} 

Это очень неудобно для написания управляющей части для каждого действия, поэтому я ищу способ избежать этого. Если бы это был Nemerle, я мог бы использовать макросы уровня атрибута, но для C#, я думаю, лучший подход - PostSharp. Каковы другие способы предоставления этой функциональности, которую вы могли бы посоветовать?

ответ

2

Существует несколько вариантов авторизации в ASP.NET MVC. То, как вы делаете, действительно очень неудобно, но есть лучший способ! Вы DO иметь атрибут макросы в C# :)

[Authorize] 
public ActionResult DoSomething(int someParam) 
{ 
    //Do stuff here. 
    Return View(); 
} 

[Авторизоваться] тег может быть помещен непосредственно над любым действием на контроллере или даже выше класс сам контроллер, чтобы сделать весь контроллер доступен только для авторизованных пользователей ,

[Authorize] 
public class HomeController : Controller 
{ 
    //Actions and stuff 
} 

Если вы используете поставщик членства и роли, вы даже можете включить в этот атрибут фильтр роли.

[Authorize(Roles="trader")] 
public ActionResult SomeAction(int someParam) 
{ 
    //stuff... 
} 

Также возможно применять авторизацию для всех URL-маршрутов. Подобно тому, как вы применяли авторизацию на уровне каталога в традиционных веб-формах ASP.NET. Просто добавьте что-то вроде этого, чтобы ваш web.config:

<location path="Admin"> 
    <system.web> 
      <authorization> 
       <deny users="?"/> 
       <allow roles="SiteAdmin"/> 
       <deny users="*"/> 
      </authorization> 
    </system.web> 
</location> 

Это говорит UrlAuthorizationModule (который зарегистрирован для всех приложений ASP.NET по умолчанию), что для URL ~/администратора и соответствия URL ~/Admin/*, он должен сделать следующее:

• Запретить доступ для анонимных посетителей()

• Разрешить доступ с проверкой подлинности посетителей в роли SiteAdmin()

• Запретить доступ ко всем другим посетителям()

Смежные вопросы