컨트롤러 작업으로 로그인 리디렉션

asp.net-core asp.net-core-mvc asp.net-identity-3 entity-framework-core

문제

개인 사용자 계정을 사용하는 ASP.NET 5 웹 응용 프로그램 템플릿부터 Microsoft 계정으로 외부 인증을 사용할 수있게되었습니다. 사용자가 로그인을 클릭하면 AccountController ExternalLogin 으로 리디렉션됩니다.

<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 계정을 사용하여 로그인하게되며 모든 것이 잘 작동하는 것처럼 보입니다. 하지만 사용자가 ExternalLogin 으로 리디렉션되도록 [Authorize] 작업 [Authorize] 에 대한 직접적인 접근을 가로채는 방법은 무엇입니까? Startup.cs 에서 기본 동작을 설정할 수 있습니까?

편집 1 @ Yves의 조언을 따르려고. 필터 폴더에 CustomAutorizationFilter 를 만들었습니다. 조건을 확인하지 않습니다.

<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>

아래와 같이 ConfigureServices 를 편집했습니다.

<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>

앱을 로컬에서 실행하면 더 이상 홈 페이지로 이동하지 않습니다. 빈 http://localhost:52711/Account/ExternalLogin 반환합니다 http://localhost:52711/Account/ExternalLogin

분명히 이해가되지 않는 부분이 많이 있습니다.

편집 2 : 다음은 ExternalLogin 의 서명입니다.

<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>

이것은 ExternalLogin 이 ASP.Net 5 Web App Template의 상자에서 나오는 모습입니다.

수락 된 답변

@Yves에서 제안한대로 CustomAuthorizationFilter 작동시킬 수 없기 때문에 불쾌한 해킹에 의지했습니다. 나는 아래와 같이 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();
    }

이것은 작동하는 것 같지만 더 좋은 방법이 있다면 나는 어떤 피드백이나 조언을 주시면 감사하겠습니다.


인기 답변

이를 수행하기 위해 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 메소드를 편집하십시오.

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);
        }
    }
}

또는 자신의 특성을 사용하지 않으려면 ActionFilterOnActionExecuting 메서드를 사용하여 원하는대로 모든 것이 발생하는지 확인할 수 있습니다.




아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.