2013-07-10 2 views
5

У меня есть действие с именем ForgetPassword. Каждый раз, когда анонимный пытается получить действие, он перенаправляется на страницу входа. Ниже приведены мои реализации.Разрешить анонимному вызывать определенное действие в asp.net mvc 3

public ActionResult ForgotPassword(string UserName) 
{ 
    //More over when i place a breakpoint for the below line 
    //its not even getting here 
    return View("Login"); 
} 

А вот часть моего файла web.config

<location path=""> 
     <system.web> 
      <authorization> 
      <deny users="?"/> 
      </authorization> 
     </system.web>  
     </location> 

    <location path="Content"> 
    <system.web> 
     <authorization> 
     <allow users="*"/> 
     </authorization> 
    </system.web>  
    </location> 

    <location path="Scripts"> 
    <system.web> 
     <authorization> 
     <allow users="*"/> 
     </authorization> 
    </system.web>  
    </location> 

    <location path="Images"> 
    <system.web> 
     <authorization> 
     <allow users="*"/> 
     </authorization> 
    </system.web>  
    </location> 

<authentication mode="Forms"> 
    <forms loginUrl="/Home/Login" timeout="5" slidingExpiration="false" /> 
</authentication> 
+0

Вы украсили свой 'Контроллер/Действие' с помощью атрибута' Authorize' или зарегистрировали глобальный фильтр 'Authorize'? – haim770

ответ

8

Как вы отказываете всем от применения, используя.

<authorization> 
    <deny users="?"/> 
</authorization> 

ИМХО, вы не должны использовать web.config для управления аутентификацией вашего приложения, а не использовать Authorize атрибут.

Добавьте это в файл Global.asax под RegisterGlobalFilters методом

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new HandleErrorAttribute()); 
    filters.Add(new AuthorizeAttribute()); //Added 
} 

или вы можете украсить также контроллер с [Authorize]

[Authorize] 
public class HomeController : Controller 
{ 
    ... 
} 

Если вы используете ASP.NET MVC4, для действий, которые требуют Anonymous использование доступа AllowAnonymous атрибут

[AllowAnonymous] 
public ActionResult ForgotPassword() { 
    //More over when i place a breakpoint for the below line 
    //its not even getting here 
    return View("Login");; 
} 

Согласно Reference, вы не можете использовать файлы маршрутизации или web.config для защиты своего приложения MVC. Единственным поддерживаемым способом защиты вашего приложения MVC является применение атрибута Authorize для каждого контроллера и использование нового атрибута AllowAnonymous для действий входа и регистрации. Принятие решений безопасности на основе текущей области - очень плохая вещь и откроет ваше приложение для уязвимостей.

+4

Does AllowAnonymous работает в MVC 3? Я так не думаю. То, о чем просил владелец почты. – user20358

0

Если вы используете ASP.NET MVC4 вы можете попытаться поставить allowanonymous атрибут на ваши действия, как это:

[AllowAnonymous] 
public ActionResult ForgotPassword(string UserName) 
{ 
    //More over when i place a breakpoint for the below line 
    //its not even getting here 
    return View("Login"); 
} 

Для получения дополнительной информации посмотрите на статью Джона Галлоуэй: Global authentication and Allow Anonymous

1

Я предполагаю, что вы устанавливаете атрибут «Авторизовать» на своем контроллере, что заставит логин для каждого действия контроллера. Я рекомендую удалить этот атрибут из контроллера и установить его для каждого действия по одному. или обновить до MVC 4 и использовать атрибут AllowAnonymous.

2

От ссылку: http://weblogs.asp.net/jongalloway/asp-net-mvc-authentication-global-authentication-and-allow-anonymous

Если вы используете MVC 3 вы не можете сделать:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new HandleErrorAttribute()); 
    filters.Add(new AuthorizeAttribute()); 
} 

Почему это глобальная и AllowAnonymous атрибут не работает на MVC 3.

Поэтому вам нужно создать собственный фильтр. Он работает для меня (MVC 3), вы можете проверить полное решение here.

using System.Web.Mvc; 
using MvcGlobalAuthorize.Controllers; 

namespace MvcGlobalAuthorize.Filters { 
    public sealed class LogonAuthorize : AuthorizeAttribute { 
     public override void OnAuthorization(AuthorizationContext filterContext)   { 
      bool skipAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true) 
      || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true); 
      if (!skipAuthorization) { 
       base.OnAuthorization(filterContext); 
      } 
     } 
    } 
} 
Смежные вопросы