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.cs
App_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
'IT이야기' 카테고리의 다른 글
git의 기록에서 제거하지 않고 분기를 닫는 방법 (0) | 2021.10.21 |
---|---|
이전 버전과 호환되는 Android 코드 작성 (0) | 2021.10.20 |
Node.js 코드의 아무 곳에서나 MongoDB 연결을 닫지 않는 것이 권장되는 이유 (0) | 2021.10.20 |
여러 페이지에서 탐색 모음을 재사용하려면 (0) | 2021.10.18 |
Docker는 종료된 컨테이너의 로그를 봅니다. (0) | 2021.10.18 |