IT이야기

Simplemembership을 사용하는 새로운 MVC 4 인터넷 템플릿의 역할 기반 인증

cyworld 2021. 10. 20. 21:33
반응형

Simplemembership을 사용하는 새로운 MVC 4 인터넷 템플릿의 역할 기반 인증


VS 2012 RTM의 외부 로그인을 위한 OAuth 링크가 있는 MVC 4 인터넷 템플릿의 새로운 단순 회원 기능이 마음에 듭니다. 대부분의 경우 인증 기능이 작동합니다. 그러나 이것에 대해 8시간 이상을 보낸 후에도 컨트롤러에서 작업하기 위해 역할 기반 권한 부여를 구현할 수 없습니다. SimpleMembership은 단순하지 않은 것으로 밝혀졌습니다.

나는 stackoverflow를 검색하고 googled하고 John Galloway 의 최신 기사를 읽었으며 많은 제안을 시도했지만 여전히이 문제를 해결할 수 없었습니다. 그것은 모두 Sql 연결 오류를 얻는 것으로 시작했으며 연결 문자열과 다른 모든 것이 좋았을 때 이유를 알 수 없었습니다. 문제를 일으키는 역할 클래스를 파악하는 데 많은 시간이 걸렸습니다.

컨트롤러의 [Authorize] 속성은 기본 인증에 대해 이전과 같이 작동합니다. 그러나 Roles를 사용하려고 할 때마다 sql 연결 오류가 발생합니다(기본 SqlExpress aspnetdb 파일에 연결을 시도하고 실패하는 이전 DefaultRolesProvider로 되돌아가기 때문에). 그래서 다음과 같은 것:

[Authorize(Roles="admin")]

작동하지 않습니다. 이전 asp.net 멤버십 공급자로 돌아가면 작동하지만 간단한 데이터베이스 테이블, 토큰 기반 확인 및 복구, 더 안전한 암호 해싱 및 더 중요하게는 OAuth를 통한 외부 로그인을 잃게 됩니다.

코드 및 면도기 보기 내에서 작동하는 유일한 것은

User.IsInRole("admin")

메뉴 항목 등에 대해서는 괜찮지만 컨트롤러의 모든 단일 작업 내부에 구현하는 것은 매우 번거롭습니다(한 번에 하나의 역할만 테스트하는 것이 마음에 들지 않습니다).

이 문제를 해결하기 위한 지침에 대단히 감사하겠습니다.


여기에서 처리 하는 것으로 보이는 Mehdi Golchin 의 답변을 찾았습니다 .

[Authorize(Roles="admin,editor,publisher")]

이것을 홈 컨트롤러에도 추가하면:

 [InitializeSimpleMembership]

이 속성은 계정 컨트롤러에 있으므로 로그인/등록과 같은 계정 컨트롤러를 처음 사용한 후에만 SimpleMembership 데이터베이스가 초기화됩니다. 현재 사용자가 쿠키에서 로그인을 해도 데이터베이스가 초기화되지 않아 오류가 발생합니다. 한 가지 해결책은 내 웹사이트를 시작할 때 호출되는 홈 컨트롤러에 이 속성을 넣는 것입니다. 그러나 역할을 확인하고 역할에 따라 다른 메뉴 항목을 표시하기 때문에 모든 컨트롤러에 배치해야 합니다.

데이터베이스가 처음 사용될 때가 아니라 App_Start에서 초기화되어야 하므로 설계가 좋지 않습니다.

넣어보기로 했어요

WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);

에서 , 를 Global.asax Application_Start()사용하여 메뉴 항목에서 역할 검사를 처리 User.IsInRole("admin")하지만 [Authorize(Roles="admin")]추가 속성 [InitializeSimpleMembership]이 적용된 경우에도 속성이 있는 모든 컨트롤러에서 오류가 발생 합니다.

따라서 지금 해결 방법은 사용자가 외부 링크를 사용하여 모든 페이지에 처음 방문할 수 있으므로 모든 컨트롤러에 `[InitializeSimpleMembership]을 설정하는 것입니다.

단순한 역할 관리 대신 더 많은 역할 관리를 수행하기 위해 SimpleRolesProvider 클래스를 초기화하는 방법을 여전히 알 수 없습니다 User.IsInRole().

이러한 것들은 webmatrix 웹 페이지 사이트에서 더 잘 작동하며 분명히 MVC의 포트가 완전하지 않습니다. 기본 asp.net 멤버십 공급자와 충돌하고 혼동됩니다.

EDIT OK [InitializeSimpleMembership]이 줄을 FilterConfig.csApp_Start 폴더 에 넣어 필터를 전역적으로 적용할 수 있다고 생각하지 않았습니다 .

filters.Add(new InitializeSimpleMembershipAttribute());

그 문제를 처리합니다. 이제 SimpleRolesProvider 초기화를 위한 솔루션이 필요합니다. 그렇지 않으면 자체 역할 공급자를 작성해야 합니다.

업데이트:

Scott Allen의게시물은 내 모든 문제를 해결했습니다.

web.config에 다음을 포함합니다.

<roleManager enabled="true" defaultProvider="simple">
  <providers>
    <clear/>
    <add name="simple" type="WebMatrix.WebData.SimpleRoleProvider,               WebMatrix.WebData"/>
  </providers>      
</roleManager>
<membership defaultProvider="simple">
  <providers>
    <clear/>
    <add name="simple" type="WebMatrix.WebData.SimpleMembershipProvider,                          WebMatrix.WebData"/>
  </providers>
</membership>

Roles 및 Membership 클래스의 모든 메서드를 사용할 수 있게 되며 다음과 같이 코드에서 초기화할 수 있습니다.

var roles = (SimpleRoleProvider) Roles.Provider;
var membership = (SimpleMembershipProvider) Membership.Provider;

내 웹 앱을 VS2010/MVC3에서 VS2012/MVC4로 이동할 때도 동일한 문제가 발생했습니다.

그리고 [InitializeSimpleMembership]이 작동하지 않습니다.

이것을 web.config에 추가하면 트릭이 작동한다는 것을 알았습니다.

  <appSettings>
    <add key="enableSimpleMembership" value="false" />
  </appSettings>

그리고 모든 것이 이전처럼 잘 작동합니다.

ReferenceURL : https://stackoverflow.com/questions/12257232/role-based-authentication-in-the-new-mvc-4-internet-template-using-simplemembers

반응형