проблема авторизации asp.net mvc - PullRequest
1 голос
/ 28 января 2010

Я пытаюсь добавить авторизацию на мои контроллеры, но она не работает ...

Я не уверен, где искать в моей программе, но добавляю

[Authorize] 
Фильтр

в моем контроллере не работает, не говоря уже о

[Authorize(Roles = "Manager")]

Мне удалось заставить это работать в приложении по умолчанию, которое предоставляется при создании нового проекта MVC (то есть я могу перенаправить вкладку «о» на экран входа, если я не вошел в систему) , так что я предполагаю, что я все испортил по пути, когда создавал свое приложение. Кто-нибудь знает, где я должен искать это исправить? У меня есть пользователи, и у них есть роли; Я использую схему ASP.net, которая создается автоматически; Я исследовал свой файл web.config вверх и вниз, и, хотя я довольно новичок в этом, похоже, ничто не уместно. Я понятия не имею, почему мои фильтры авторизации не работают .?.

1 Ответ

1 голос
/ 02 февраля 2010

Я написал собственный атрибут для решения этой проблемы.Вы можете приписать методы вашего контроллера следующим образом:

[RequiresRole(Role="Admin")]
public ActionResult Index()
{
    int i = 5 + 5;

    return View();
}

Код атрибута следующий:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;

namespace Web.Controllers
{
    public class RequiresRoleAttribute : ActionFilterAttribute
    {
        public string Role { get; set; }

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (string.IsNullOrEmpty(Role))
            {
                throw new InvalidOperationException("No role specified.");
            }

            string redirectOnSuccess = filterContext.HttpContext.Request.Url.AbsolutePath;
            string redirectUrl = string.Format("?returnUrl={0}", redirectOnSuccess);
            string loginUrl = FormsAuthentication.LoginUrl + redirectUrl;

            if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
            {
                filterContext.HttpContext.Response.Redirect(loginUrl, true);
            }
            else
            {
                bool isAuthorised = filterContext.HttpContext.User.IsInRole(this.Role);
                if (!isAuthorised)
                {                        
                    filterContext.HttpContext.Response.Redirect(loginUrl, true);
                }                
            }  
        }      
    }
}
...