2014-12-11 3 views
2

Я создаю ASP.NET MVC 5 с шаблоном аутентификации «Индивидуальные учетные записи пользователей». Затем я создаю пользовательскую страницу входа для аутентификации пользователя из базы данных с помощью проверки подлинности с помощью форм.ASP.NET MVC 5 Неверный перенаправление Вход в систему

<authentication mode="Forms"> 
    <forms loginUrl="~/User/SignIn" timeout="2880" protection="All" /> 
</authentication> 

Для тестирования пользовательской страницы входа в систему, я добавляю HomeController с Authorize атрибутом. После запуска Visual Studio, это перенаправление на страницу входа

Проблема в том, когда я удаляю Authorize атрибут в HomeController и добавить Авторизоваться фильтр на FilterConfig.cs

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

Я получил ошибку HTTP: " Ошибка HTTP 401.0 - Несанкционированный ". Как это исправить?

+2

[AllowAnonymous] на действии –

+0

зарегистрировались @PaulZahra спасибо, теперь он работает, я думаю, теперь я понимаю – Willy

+0

Okidoki, я буду добавлять его в качестве ответа тогда,?..?) –

ответ

3

Потому что я поставил правильный ответ в качестве комментария по крайней мере за 8 минут до того, как я это сделаю, я добавлю его в качестве ответа.

Вам необходимо добавить атрибут [AllowAnonymous] к вашему действию SignIn, потому что по существу созданный вами фильтр делает каждое действие требует авторизации для просмотра.

Взятые из AllowAnonymous attribute information

»... в ASP.NET MVC 4, это запеченный в К запеченные, я имею в виду, что:. Там есть встроенный AllowAnonymousAttribute в пространстве имен System.Web.Mvc, который белые списки действий для анонимного доступа ».

Взятые из Global action filters information

«ASP.NET MVC 3.0 вводит глобальные фильтры действий - легкий способ применить фильтр действий для каждого действия в приложении MVC."

[AllowAnonymous] 
public ActionResult SignIn() { 
} 
4

При этом вы устанавливаете ограничения на авторизацию при регистрации и регистрации. Итак, вы должны быть авторизованы для входа или регистрации. Использование атрибутов allowAnonymous для этих действий может решить проблему.

0

Вы добавили глобальный атрибут. Вам нужно добавить атрибут [AllowAnonymous] тем, к которым вы не хотите применять правило;

[AllowAnonymous] 
    public ActionResult Home() { 
    // ... 
    } 
0

Запишите, что вы добавляете AuthorizeAttribute в глобальный фильтр. Когда вы не авторизованы и не получите доступ ко всему действию, будет перенаправлен на «~/User/SignIn», но вам нужно разрешить сопоставление действий «~/User/SignIn». Вы можете попробовать это:

public class NoNeedAuthorizeAttribute : Attribute 
{ 
} 

И наследуют AuthorizeAttribute переопределить OnAuthorization метод, если действие имеет NoNeedAuthorize атрибут проигнорирует:

public override void OnAuthorization(AuthorizationContext filterContext) 
{ 
    if (!filterContext.ActionDescriptor.GetCustomAttributes(typeof(NoNeedAuthorizeAttribute), true).Any()) 
    { 
     base.OnAuthorization(filterContext); 
    } 
} 

Добавьте NoNeedAuthorizeAttribute к вашей акции зарегистрировались:

public class UserController : Controller 
{ 
    [NoNeedAuthorize] 
    public ActionResult SignIn() 
    { 
     //Sign in code.. 
    } 
} 

Наконец, добавьте 'GlobalAuthorizeAttribute' к глобулярному фильтру:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new HandleErrorAttribute()); 
    filters.Add(new GlobalAuthorizeAttribute()); 
} 
+0

зачем изобретать колесо Атрибут AllowAnoymous делает это лучше, чем вы заявляете здесь :) –

+0

@Ahmedilyas Да, я никогда раньше не использовал атрибут AllowAnoymous. Но я думаю, что я его сейчас получаю. –