5

Начиная с шаблона веб-приложения ASP.NET 5 с использованием индивидуальных учетных записей пользователей, мне удалось получить внешнюю аутентификацию, работающую с учетными записями Microsoft. Когда пользователь нажимает кнопку Login они перенаправляются на ExternalLogin в AccountController как этотRedirect Login to Controller Action

<form asp-controller="Account" asp-action="ExternalLogin" method="post" asp-route-returnurl="@ViewData["ReturnUrl"]" class="nav navbar-right"> 
    <button type="submit" class="btn btn-null nav navbar-nav navbar-right" name="provider" value="Microsoft" title="Log in"><span class="fa fa-sign-in"/>&nbsp; Log In</button> 
</form> 

, который получает их вошли в систему с помощью учетной записи Microsoft тир и все, кажется, работает хорошо. Но как мне перехватить прямые попытки доступа к привилегированным действиям [Authorize] , чтобы пользователь перенаправлялся на ExternalLogin? Можно ли установить действие по умолчанию в Startup.cs?

EDIT 1 Попытка следовать рекомендациям @Yves Я создал CustomAutorizationFilter в папке Фильтры. Он не проверяет для любых условий

public class CustomAutorizationFilter : IAuthorizationFilter 
{ 
    public void OnAuthorization(Microsoft.AspNet.Mvc.Filters.AuthorizationContext context) 
    { 
     //if (...) // Check you conditions here 
     //{ 
      context.Result = new RedirectToActionResult("ExternalLogin", "Account", null); 
     //} 
    } 
} 

и отредактировали ConfigureServices ниже

 services.AddMvc(config => 
     { 
      config.Filters.Add(typeof(Filters.CustomAutorizationFilter)); 
     }); 

Когда я запустить приложение локально он больше не выходит на главную страницу. Он возвращает пробел http://localhost:52711/Account/ExternalLogin

Очевидно, что я не очень понимаю.

Edit 2: Вот подпись ExternalLogin

// POST: /Account/ExternalLogin 
    [HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    public IActionResult ExternalLogin(string provider, string returnUrl = null) 

Это как ExternalLogin выходит из коробки в ASP.Net 5 Web App шаблона.

+0

Я думаю, что после редактирования может возникнуть цикл перенаправления. Попробуйте добавить 'AllowAnonymousAttribute' в ваш контроллер' ExternalLogin'. Если я не ошибаюсь, этот атрибут обходит «IAuthorizationFilter». Вы можете отладить его, чтобы посмотреть, что происходит. Я не в ПК-банкомате. Поэтому я не могу проверить это. – Yves

+0

Я добавил подпись 'ExternalLogin' к моему вопросу. – Vague

+0

@Yves правильно относится к циклу перенаправления. Он продолжает цикл через 'context.Result = new RedirectToActionResult (« ExternalLogin »,« Account », null);' Без всякого удара 'ExternalLogin' – Vague

ответ

2

Поскольку я не смог получить CustomAuthorizationFilter, работая по предложению @Yves, я прибегал к неприятному взлому. Я изменил AccountController Login ниже

 // GET: /Account/Login 
    [HttpGet] 
    [AllowAnonymous] 
    public IActionResult Login(string returnUrl = null) 
    { 
     ViewData["ReturnUrl"] = returnUrl; 
     return RedirectToAction(nameof(ExternalLogin), new { provider = "Microsoft", returnUrl = returnUrl }); 
     //return View(); 
    } 

Это похоже на работу, но я бы признателен за любую обратную связь или совет, если есть лучший способ.

3

Для этого вы можете зарегистрировать IAuthorizationFilter или IActionFilter. В этих фильтрах вы можете проверить, пытается ли запрос получить доступ к привилегированному действию, если пользователь зарегистрирован или имеет достаточное разрешение для его выполнения.

Если вы используете AutorizeAttribute, я предлагаю вам использовать AutorizationFilter. Если вы используете свои собственные атрибуты, используйте ActionFilter.

Вот пример:

MVC вызывает метод IAuthorizationFilter.OnAuthorization перед каждым выполнением действия.

public class CustomAuthorizationFilter : IAuthorizationFilter 
{ 
    public void OnAuthorization(Microsoft.AspNet.Mvc.Filters.AuthorizationContext context) 
    { 
     if (...) // Check you conditions here 
     { 
      context.Result = new RedirectToActionResult("ExternalLogin", "Account", null); 
     } 
    } 
} 

Чтобы зарегистрировать этот фильтр, в Startup.cs редактировать ConfigureServices метод:

services.AddMvc(config => 
{ 
    config.Filters.Add(typeof(CustomAuthorizationFilter)); 
}); 

Или, если вы тусклый использовать свои собственные атрибуты, которые вы можете использовать метод OnActionExecutingActionFilter «s, чтобы проверить, все ли случается так, как вы хотите ...

+0

Спасибо @Yves. Какие условия проверяются? Вы говорите о чем-то вроде 'if (! User.IsAuthorized)' или вы имеете в виду что-то еще? Наша настройка довольно проста; Я просто хочу знать, вошли ли они в систему или если они находятся в роли «Админы». – Vague

+0

Если вы просто хотите переадресовать неавторизованных пользователей, то я думаю, что IsAuthorized достаточно. Это действительно зависит от вашей бизнес-логики;) – Yves

+0

Еще раз спасибо @Yves. Я все еще не получаю результат, на который надеюсь. Я отредактировал свой вопрос, чтобы включить мою попытку следовать вашему совету. – Vague