2009-10-31 5 views
5

내 ASP.NET MVC [Authorize()] 특성을 사용하여 사용자 지정 멤버 자격 공급자를 묶는 방법은 무엇입니까? 커스텀 멤버십 공급자를 만드는 방법에 대한 자습서가 많이 있지만, 애플리케이션에 연결하는 방법에 대해 알아 낸 모든 정보는 일반적인 ASP.NET WebForms 애플리케이션을 중심으로 움직이는 것처럼 보입니다. 케이크의.ASP.NET MVC 응용 프로그램에 사용자 지정 멤버 자격 공급자를 연결하려면 어떻게합니까?

ASP.NET MVC에서 발생하는 "마술"의 양이 너무 커지지 만 WebForms 방식으로 플러그인하는 데 익숙해졌습니다. 따라서이 방법은 "작동합니다"방법론이 있습니다. 나를위한 정신 벤더. 나는 무거운 짐을 짊어지기로되어있는 때를 어떻게 알 수 있습니까? 아니면 나는 마술에 의해서만 그것을 의지 할 것입니까?

어디에서 공급자를 MVC 앱에 묶어야합니까? 일단 내가 엮여 진다면 [Authorize()] 속성을 통해 호출된다고 가정하면 되겠습니까?

답변

6

다른 답변보다 명확한 부분을 추가하여 혼란에 도움이되지 않는 문제에 대해 설명하지 않기를 바랍니다.

첫번째로, 당신의 사용자 지정 공급자를 구현하는 것을 당신이 이미 완료했습니다, 그래서 조금 코드를 던질거야 여기에 더 세부 사항으로 가지 않을 것이다 소리에서 :

using System.Web.Security; 

public class MyCustomMembershipProvider : MembershipProvider 
{ 
    public override bool ValidateUser(string username, string password) 
    { 
     if (username.Equals("BenAlabaster") && password.Equals("Elephant")) 
      return true; 

     return false; 
    } 

    /* Override all the other methods required to extend MembershipProvider */   
} 

<membership defaultProvider="MyCustomMembershipProvider">  
    <providers>   
     <clear />   
     <add name="MyCustomMembershipProvider" 
      type="MyNamespace.MyCustomMembershipProvider" 
      enablePasswordRetrieval="false" 
      enablePasswordReset="true"   
      requiresQuestionAndAnswer="false"   
      requiresUniqueEmail="true"   
      passwordFormat="Hashed"   
      maxInvalidPasswordAttempts="10"   
      minRequiredPasswordLength="6"   
      minRequiredNonalphanumericCharacters="0"   
      passwordAttemptWindow="10"   
      passwordStrengthRegularExpression=""   
      applicationName="/" />  
    </providers>  
</membership> 

난 당신이 지나친 것 같아 다음 비트, 실제 끼워 팔기에 웹 응용 프로그램 :

는 그런 다음베이스는 MembershipProvider를 구성 속성을 채우기 위해 확인하는 당신의 Web.config에 공급자를 구성 . WebForms 앱에서는 나머지를 스스로 코딩해야하지만 MVC 프레임 워크는 나머지 작업을 수행해야합니다. 액션 메소드에 [Authorize] 속성을 추가하면 프레임 워크가 로그인하고 로그인 페이지로 리디렉션하지 않은 경우 즉, Web.config의 구성이고에 사용자를 기록합니다 무엇 때문에 로그인 페이지가 사용자 지정 공급자를 찾을 수 당신은하여 사용자 객체 참조하여 컨트롤러에서 로그인 한 사용자에 대한 정보에 액세스 할 수 있습니다.

public class WhateverController : Controller 
{ 
    [Authorize] 
    public ActionResult WhateverAction() 
    { 
     ViewData["LoggedInAs"] = string.Format("You are logged in as {0}.", User.Identity.Name); 
     Return View(); 
    } 
} 

이 작업을 수행하려면 사용자가 로그인되어 있고 페이지에 표시 될 Whatever/WhateverAction.aspx보기에 사용자 정보를 제공해야합니다.

+0

좋아요, 그건 의미가 있습니다 - 정리 해줘서 고마워요. 나는 단지 두 개와 두 개를 맞추지 않고 있었다. 나는 여전히 WebForms 프레임에 머물러 있고 MVC가 나를 위해 그것을 할 때 그리고 내가 직접 처리해야 할 때를 알아 내지 못했다. – BobTheBuilder

0

이 맞춤 회원 자격에서 얼마를 변경 했습니까? 네가 테이블 이름을 바꾼 것처럼? 사용자를 로그인 할 수 있습니까? 즉, 맞춤 멤버십이 작동합니까?

역할 테이블 이름을 다른 것으로 변경하거나 Authroize 태그를 무시해야하는 것과 같이 많은 것을 변경 한 경우

그러나 맞춤 회원이 작동하지 않는 경우 제대로 구성하지 않았으며 구성이 webform과 동일합니다. webconfig를 설치하기 만하면됩니다.

</authentication> 
    <membership> 
     <providers> 
     <clear /> 
     <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ConnectionString" 
     enablePasswordRetrieval="false" 
     enablePasswordReset="true" 
      requiresQuestionAndAnswer="false" 
      requiresUniqueEmail="true" 
      passwordFormat="Hashed" 
      maxInvalidPasswordAttempts="10" 
      minRequiredPasswordLength="6" 
      minRequiredNonalphanumericCharacters="0" 
      passwordAttemptWindow="10" 
      passwordStrengthRegularExpression="" 
      applicationName="/" /> 
     </providers> 
    </membership> 
    <profile> 
     <providers> 
     <clear /> 
     <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ConnectionString" applicationName="/" /> 
     </providers> 
    </profile> 
    <roleManager enabled="true"> 
     <providers> 
     <clear /> 
     <add connectionStringName="ConnectionString" 
      applicationName="/" name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> 
     <add applicationName="/" name="AspNetWindowsTokenRoleProvider" 
      type="System.Web.Security.WindowsTokenRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> 
     </providers> 
    </roleManager> 
+0

"우리는 무엇을 바꾸고 물건을 바꿨습니까?"라고 말할 때, 우리는 ASP.NET MVC 마법사가 설정하지 않은 기존 사용자 데이터베이스를 사용하고 있습니다. 솔직히 말해서 우리는 튜토리얼 1을 사용할 의도가 없으며, 필요 이상으로 복잡하고 비즈니스 모델의 요구를 충족시키지 못합니다. 우리가 멤버쉽 제공자를 작성 했으니 까 ... 내가 우스꽝 스럽다는 점은 web.config에서 지정한 내 사용자 정의 공급자를 웹 응용 프로그램의 코드베이스에 어떻게 연결시킬 것인가? – BobTheBuilder

+0

내가 제공 한 모든 것은 사용자 지정 공급자를 사용하여 사용자 지정 데이터베이스를 설치하는 데 사용하는 것입니다. aspnet_UserInRoles를 사용하는 것처럼 테이블을 나열 할 수 있습니까? aspnet_user 및 aspnet 접두사가있는 테이블? – chobo2

1

내 사용자 지정 멤버 자격 공급자는 Web.config의에서 참조 :

<membership defaultProvider="MyMembershipProvider"> 
    <providers> 
    <clear/> 
    <add name="MyMembershipProvider" type="Namespace.MyMembershipProvider, Namespace" connectionStringName="connstring" [...] /> 
    </providers> 
</membership> 

은 그럼 그냥 정적 멤버 클래스를 사용합니다.

+0

멋진 점 - web.config에서 여러 항목을 지정하는 것을 중단하고 웹 응용 프로그램에서 어디에서 작동하게 할 수 있습니까? – BobTheBuilder

+0

실제로 여러 멤버 자격 공급자를 지정할 수 있습니다. 그것이 defaultProvider를 지정해야하는 이유입니다. 여러 공급 업체의 유틸리티는 복잡한 인증 메커니즘에서만 볼 수 있습니다. 그러나 코드에서 공급자 목록을 얻으려면 web.cofig에 지정된 멤버 자격 공급자 컬렉션을 반환하는 System.Web.Security.Membership.Providers 속성을 사용하면됩니다. zowens 님이 작성한대로 – zowens

+0

사실, 그냥 평소대로 알려진 공급자를 인스턴스화 할 수 있습니다 MembershipProvider mp = new MyMembershipProvider(); 또는 Membership.Providers에서 반환 한 목록에서 가져옴 – twk

관련 문제