programing tip

MVC 컨트롤러에서 한 작업에 대한 인증을 비활성화 할 수 있습니까?

itbloger 2021. 1. 7. 07:42
반응형

MVC 컨트롤러에서 한 작업에 대한 인증을 비활성화 할 수 있습니까?


컨트롤러에 권한 부여 속성이 있지만 한 가지 작업에 대해 해제하고 싶습니다. 나만의 인증 필터를 만들고 역할 목록에 "익명"을 추가했습니다. 내 필터에서 익명이 역할 목록에 나타나면 true를 반환합니다.

그러나 컨트롤러 인증이 다른 것을 선점하는 것처럼 로그인 페이지를 통과하지 못하는 것 같습니다.


당신은 추가 할 수 있습니다 [Authorize]컨트롤러 클래스에 다음 추가 [AllowAnonymous]당신이 권한을 부여하지 않으려는 하나의 행동. 예:

[Authorize]
public class AccountController : Controller
{
    public ActionResult Profile()
    {
        return View();
    }

    [AllowAnonymous]
    public ActionResult Login()
    {
        return View();
    }
}

고유 한 버전의 속성을 만들 수 있습니다.

매우 유사한 질문이 있으며이 상황을 처리하는 자신의 속성을 구현하는 방법에 대한 꽤 좋은 대답이 있습니다.

ASP.NET MVC에서 권한 부여 특성 재정의

Btw. 기본적으로 권한이있는 컨트롤러를 만들 수도 있습니다.

베이스

[Authorize]
public abstract class SecureControllerBase : Controller
{
}

용법

public class MyController : SecureControllerBase
{
}

방금 Azure ACS를 페더레이션 ID 공급자로 사용하는 솔루션을 수행했지만 수락 된 답변이 저에게 적합하지 않았습니다. 어려움을 겪는 사람들을 위해 내 솔루션은 필요한 컨트롤러 /보기에 대해 보안을 모두 우회하는 것이 었습니다.

인증을 우회해야하는 작업에 대한 새 컨트롤러 /보기를 만듭니다.

그리고 web.config에서 다음을 추가하십시오.

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

컨트롤러 클래스가 아니라 필터링하려는 작업에 속성을 추가하기 만하면됩니다. 동작을 꾸미지 않음으로써, 컨트롤러 또는 기본 컨트롤러 중 하나에 속성이 없으면 필터링되지 않습니다.


예를 들어 필요하지 않은 작업 메서드에 AuthorizationAttribute를 추가하지 마십시오.

내 맞춤 속성

public class AuthorizationFilterAttribute : AuthorizeAttribute
{
    // Some code...
}

내 컨트롤러

public class UserController : BaseController, IDisposable
{
    [AuthorizationFilterAttribute]
    public ActionResult UserList()
    {
        // Authorize attribute will call when this action is executed
    }

    public ActionResult AddUser()
    {
        // Authorize attribute will not call when this action is executed
    }
}

I hope you got my point what I am trying to say you.

============================ Updated Answer ================================

Create one more attribute like below.

public sealed class AnonymousAttribute : Attribute { }

Please put below code on your OnAuthorization method.

public override void OnAuthorization(AuthorizationContext filterContext)
{
    bool checkForAuthorization =
        filterContext.ActionDescriptor.IsDefined(typeof(AnonymousAttribute), true) ||
        filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AnonymousAttribute), true);

    if (!skipAuthorization)
    {
        base.OnAuthorization(filterContext);
    }
}

ReferenceURL : https://stackoverflow.com/questions/9581270/is-it-possible-to-disable-authorization-on-one-action-in-an-mvc-controller

반응형