Как сделать перенаправление авторизации на ASP.NET MVC - PullRequest
2 голосов
/ 05 июня 2009

Итак, я родом из ASP.NET 2.0 WebForms и являюсь новичком в ASP.NET MVC, что мне кажется чудесным, однако я к этому несколько привык.

На этот раз моя проблема связана с моделью аутентификации и авторизации:

Я использовал для ограничения папок через раздел авторизации Web.config

    <authorization>
        <deny users="?"/>
        <!--
        <allow users="*"/>
  -->
    </authorization>

Таким образом, когда пользователь пытается получить доступ к закрытой «странице», он перенаправляется на страницу индекса; Как я могу сделать это на MVC? Раньше я сохранял идентификатор пользователя (или объект) в данных сеанса ... теперь я не знаю, как и где его хранить, по-MVC.

В качестве примечания моя модель данных имеет следующую таблицу:

CREATE TABLE user_perm (
    user INT,
    feature INT,
)

И я хотел бы ограничить доступ к определенным контроллерам на основе содержимого этой таблицы. Как я могу этого достичь?

PS: я знаю об этих других вопросах, но они относятся к бета-версии, и я не уверен, применимы ли они к текущей выпущенной версии.

Заранее спасибо

Ответы [ 3 ]

3 голосов
/ 05 июня 2009

Вы должны попробовать фильтрацию атрибутов на действиях контроллера. (См. эту ссылку для хорошей информации.)

Действия контроллера указывают на реальные «страницы», вы должны их защитить.

Что я использую (пользовательский атрибут ...):

Public Class ProjectController
    Inherits System.Web.Mvc.Controller

    <Models.Authentication.RequiresAuthentication()> _
    Function Edit(ByVal id As Integer) As ActionResult

    End Function

    <Models.Authentication.RequiresRole(Role:="Admin")> _
    Function Delete(ByVal id As Integer) As ActionResult

    End Function
End Class

И атрибут авторизации:

Namespace Models.Authentication
    Public Class RequiresAuthenticationAttribute : Inherits ActionFilterAttribute
        Public Overrides Sub OnActionExecuting(ByVal filterContext As System.Web.Mvc.ActionExecutingContext)
            If Not filterContext.HttpContext.User.Identity.IsAuthenticated Then
                Dim redirectOnSuccess As String = filterContext.HttpContext.Request.Url.AbsolutePath
                Dim redirectUrl As String = String.Format("?ReturnUrl={0}", redirectOnSuccess)
                Dim loginUrl As String = FormsAuthentication.LoginUrl + redirectUrl

                filterContext.HttpContext.Response.Redirect(loginUrl, True)
            End If
        End Sub
    End Class

    Public Class RequiresRoleAttribute : Inherits ActionFilterAttribute
        Private _role As String

        Public Property Role() As String
            Get
                Return Me._role
            End Get
            Set(ByVal value As String)
                Me._role = value
            End Set
        End Property

        Public Overrides Sub OnActionExecuting(ByVal filterContext As System.Web.Mvc.ActionExecutingContext)
            If Not String.IsNullOrEmpty(Me.Role) Then
                If Not filterContext.HttpContext.User.Identity.IsAuthenticated Then
                    Dim redirectOnSuccess As String = filterContext.HttpContext.Request.Url.AbsolutePath
                    Dim redirectUrl As String = String.Format("?ReturnUrl={0}", redirectOnSuccess)
                    Dim loginUrl As String = FormsAuthentication.LoginUrl + redirectUrl

                    filterContext.HttpContext.Response.Redirect(loginUrl, True)
                Else
                    Dim hasAccess As Boolean = filterContext.HttpContext.User.IsInRole(Me.Role)
                    If Not hasAccess Then
                        Throw New UnauthorizedAccessException("You don't have access to this page. Only " & Me.Role & " can view this page.")
                    End If
                End If
            Else
                Throw New InvalidOperationException("No Role Specified")
            End If

        End Sub
    End Class
End Namespace
2 голосов
/ 05 июня 2009

используйте атрибут Authorize. Вы можете разместить его на отдельных действиях или на всем контроллере.

[Authorize(Roles="admin")]

Больше информации здесь:

http://forums.asp.net/p/1428467/3192831.aspx

1 голос
/ 05 июня 2009

Они обрабатываются нами через атрибуты.

    [Authorize]
    public ActionResult SomeAction() {
        return View();
    }

«[Авторизовать]» эквивалентно «[Авторизовать (Roles =" user ")]». Для определенных ролей используйте [Authorize (Roles = "")].

...