2017-12-21 53 views
3

막혔습니다.Azure AD B2C에 대한 OWIN/OIDC를 사용하여 사용자 지정 Umbraco 컨트롤러 인증

RenderMvcController에서 상속받은 사용자 지정 Umbraco 컨트롤러가 있고 Index() 동작 메서드가 눌려지면 파일이 반환됩니다. 이 방법이 효과적이지만, 내가하고자하는 일은 AuthorizeAttribute으로 동작을 꾸미고 사용자가 인증하도록 요구하는 것입니다.

namespace MyNamespace.Controllers 
{ 
    public class MyModelController : RenderMvcController 
    { 
     [Authorize] 
     public ActionResult Index(RenderModel model) 
     { 
      // ... 
     } 
    } 
} 

인증은 Azure AD B2C 응용 프로그램과의 OWIN 및 OpenId Connect를 사용하여 수행해야합니다. 이것은 또한 작동하지만 테스트되었지만 Umbraco가 아닌 상황에서 테스트되었습니다.

주제와 관련된 수많은 스레드와 코드를 읽었지 만 Umbraco에서이를 통합하는 데 어려움을 겪고 있습니다. UmbracoDefaultOwinStartup에서 상속받은 사용자 지정 시작 클래스가 있습니다. 맞춤 경로를 AuthController에 등록하고 IAppBuilder.UseOpenIdConnectAuthentication()을 통해 OIDC를 구성합니다.

하지만 Umbraco 접착제가 필요하며 쿠키 구성 방법을 이해하는 데 문제가 있습니다. 시작 Configuration() 메서드가 호출되었는지 확인했습니다.

namespace MyNamespace 
{ 
    public class CustomOwinStartup : UmbracoDefaultOwinStartup 
    { 
     public override void Configuration(IAppBuilder app) 
     { 
      base.Configuration(app); 
      ConfigureAuth(app); 

      RouteTable.Routes.MapRoute(
       "CustomAuth", 
       "CustomAuth/{action}", 
       new { controller = "Auth" } 
      ); 
     } 

     private void ConfigureAuth(IAppBuilder app) 
     { 
      app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); 
      app.UseCookieAuthentication(new CookieAuthenticationOptions 
      { 
       AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
       LoginPath = new PathString("/CustomAuth/SignUpSignIn") // TODO: What should I put here? 
      }); 
      app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 
      app.UseOpenIdConnectAuthentication(
       // Passing options that are tested and working 
      ); 
     } 
    } 
} 

그리고 나서 당분간은 매우 간단한 내 인증 컨트롤러가 있습니다. Umbraco 사용자와 인증 정보를 동기화 할 필요가 없습니다.

namespace MyNamespace.Controllers 
{ 
    public partial class CustomAuthController : Controller 
    { 
     public CustomAuthController() : base() 
     { 
     } 

     public void SignUpSignIn() 
     { 
      if (!Request.IsAuthenticated) 
      { 
       HttpContext.GetOwinContext().Authentication.Challenge(); 
       return; 
      } 

      Response.Redirect("/"); // TODO: Maybe this should redirect me back to original route MyModel/Index in some way 
     } 
    } 
} 

내가 이것을 실행하고 나는이 오류가 내 속성 장식 사용자 정의 Umbraco 컨트롤러를 통해 시도하는 경우 :

Page not found

No umbraco document matches the url '/login.aspx?ReturnUrl=MYORIGINALROUTEHTTPENCODED' . This page can be replaced with a custom 404. Check the documentation for "custom 404".

내 생각 엔이 때문에 Web.config<authentication mode="Forms"> 설정입니다 만, 경우이다 이 항목을 제거하거나 mode이라는 속성을 "None"으로 설정하면 백 오피스 로그인에 영향을주지 않을까요?

누구나 나를 올바른 방향으로 안내 할 수 있다면 매우 감사합니다!

+0

[이 샘플 앱] (https://github.com/Azure-Samples/active-directory-b2c-dotnet-webapp-and-webapi/blob/master/TaskWebApp/App_Start/)을 검토하셨습니까? Startup.Auth.cs)는 owin w/b2c를 사용합니까? – spottedmahn

+1

예, OIDC 구성자로 전달할 옵션 개체의 기초입니다. – Viktor

+0

좀 더 자세히 설명하기 위해 샘플 앱을 사용하여 작동하도록했으나 이제는 그대로두고 자하는 인증이있는 기존 Umbraco 애플리케이션에 동일한 인증 레이어를 추가하려고합니다. Umbraco의 프런트 엔드 사용자 저장소에 연결할 수있는 사용자 지정 인증이 필요하지 않습니다. 이후 auth-then-forget 만 수행하기 때문입니다. 또는 어쩌면 auth-then-maybe-log. 나머지 사이트는 공개적으로 액세스 할 수 있습니다. – Viktor

답변

2

불행히도 나는 같은 환경을 설정하고 모든 것을 검사 할 충분한 시간이 없지만 몇 가지 생각을하고 여러 링크를 게시 할 것입니다.

백 오피스 로그인 로직을 무시하려면 사용자 정의 인증 컨트롤러를 만들거나 로그인 페이지를 덮어 쓸 필요가 없습니다. Umbraco는 인증을 위해 ASP.NET ID를 사용하므로 OWIN 시작시이를 올바르게 구성해야하므로 필요에 따라 작동합니다. 그런 다음 Umbraco 인증 도구를 사용하여 사용자가 MyModelController의 색인 작업을 누를 수 있는지 확인합니다.

사용자 이름/암호 확인을 구현해야하는 경우 Umbraco 확장 프로그램을 사용하십시오. 더보기 : https://our.umbraco.org/documentation/Reference/Security/#replacing-the-basic-username-password-check

또한 Active Directory 용 Umbraco 확장을 사용할 수 있습니다. 더보기 : https://our.umbraco.org/documentation/Reference/Security/#authenticating-with-active-directory-credentials

그리고 AuthorizeAttribute에 대해서. 을 찾을 수 없습니다. 오류 원인 은 OWIN 및 Umbraco에 대해 아무것도 모릅니다. login.aspx 페이지의 기본 경로로 리디렉션되며 프로젝트에 존재하지 않습니다. <authentication mode="Forms">None으로 설정할 수 있습니다. Umbraco 백 오피스에 ASP.NET Identity를 사용하기 때문에 영향을 미치지 않습니다. 일부 리소스를 보호하려면 UmbracoAuthorizeAttribute를 사용할 수 있습니다.

은 자세한 내용보기 :

https://our.umbraco.org/documentation/Implementation/Controllers/#mvc 어쨌든 더 Umbraco 자습서 및 문서를 참조하십시오. 나는 당신이 대답을 찾을 수 있기를 바랍니다. 더 많은 것을 물어보십시오.

는 AuthorizeAttribute의 자신의 버전을 사용

에 한번 업데이트되었습니다. 예가 있습니다 : http://www.c-sharpcorner.com/UploadFile/56fb14/custom-authorization-in-mvc/

AuthorizeCore 메서드를 재정의하고 HandleUnauthorizedRequest에서 필요한 결과를 반환해야합니다. 따라서 RedirectResult를 로그인 페이지 나 필요한 것을 반환 할 수 있습니다.

당신은 업데이트

[CustomAuthorize] 
    public ActionResult Index(RenderModel model) 
    { 
     // ... 
    } 

로 다음을 적용 할 수 있습니다

2 사용자 정의 AuthorizeAttribute 도움이되지 않거나 당신이 당신의 ActionFilter을 만들 수 있습니다 일을하고 거기에 인증 로직을 넣어하지 않습니다. 물론 모범 사례는 아니지만 적어도 시도해 볼 수는 있습니다. 참조 : https://msdn.microsoft.com/en-us/library/gg416513(vs.98).aspx#Anchor_2

+0

백 오피스 로그인을 무시할 필요가 없습니다. 간단히 말하면 : 특정 문서 유형에 액세스하려고 할 때 사용자를 인증하려고합니다. 사용자가 내 ID 공급자에 등록되어 있음을 알고 싶습니다. 나는 'MemberAuthorizeAttribute'를 사용하여 문서 유형 컨트롤러를 보호하려고 시도했지만 "이 유형의 페이지가 제공되지 않습니다"라는 오류를 렌더링합니다. 그러나 나는 HttpContext.GetOwinContext(). Authentication.Challenge()를 통해 나의 OAuth 공급자를 호출 할 수있다. 요청이 인증되지 않은 경우'MemberAuthorizeAttribute'가 수행하는 작업을 어떤 식 으로든 재정의 할 수 있습니까? – Viktor

+0

불행히도 MemberAuthorizeAttribute를 사용하여 사용자의 승인 여부를 확인할 수 없습니다. 원하는 경우 여기에서 자세한 내용을 볼 수 있습니다. https://our.umbraco.org/forum/developers/api-questions/53816-MemberAuthorize-Redirection#comment-186685. 귀하의 필요를 이해했으며 귀하의 질문에 대해 더 자세히 살펴 보겠습니다. – Iaroslav

+0

사용자 정의 AuthorizeAttribute를 작성하려 했습니까? 나는 그것이 효과가 있다고 생각한다. 이전 프로젝트 중 하나에서 그 접근법을 보았습니다. 우리는 웹 API를 가지고 있었지만 MVC는 거의 같아야합니다. 여기에 : http : //www.c-sharpcorner.com/UploadFile/56fb14/custom-authorization-in-mvc/ OWIN 컨텍스트를 통해 사용자를 확인할 수 있으며 필요하면 로그인 페이지 나 원하는대로 리디렉션 할 수 있습니다. 도움이되거나 더 많은 설명이 필요한 경우 저에게 이메일을 보내주십시오. – Iaroslav