2014-04-20 3 views
3

새로운 ASP.NET ID 시스템에 대한 사용자 지정 "저장소 공급자"를 만들 때이 게시물을 추적했으며 지금까지 매우 유익한 것으로 입증되었습니다. 내가 MySQL을 사용하고 있지 않다ASP.NET ID - [Authorize] 및 RoleManager에 대한 혼동

Creating a custom MySQL Identity Provider

, 나는 RavenDB를 사용하고 - 그래, 나는 이미이 가능한 RavenDB ID 제공 받게 요 - 그게 정말 내 문제가되지 않습니다. 내 문제는 IUserRoleStore<IdentityUser>, 그 다음은 IdentityRoleRoleStore입니다.

내가 그들을 만든 걸보고 - 나는 심지어는 사용자가 나중에 다음 역할에 등 그러나 있는지 확인하기 위해 데이터에 액세스하는 방법을 참조, 난 그냥이 볼 ..

[Authorize(Roles = "Admin")] 
public AccountController : Controller { 
    /// ... etc .etc.. 
} 

이 어디 I 철저히 분실하고있다. 새로운 ASP.NET ID 시스템에 대한 수십, 수십, 수십 개의 자습서를 살펴 보았고 어떤 점에서 뭔가가 AuthorizeAttribute과 연결될 수 있는지 파악할 수 없습니다. 내가 만든 RoleStore을 어떻게 사용하는지 알고 있습니까? 내가 만든 IdentityRole을 사용하는 방법을 어떻게 알 수 있습니까? 그것에 대해 확인하는 것은 무엇입니까?

이러한 것들은 내가 어디에서나 찾을 수없는 모든 것들이며, 그것은 나에게 일종의 박쥐를 몰고 간다. 내가 찾은 모든 것은 Entity Framework에 계속 연결되어 있습니다.이 프레임 워크는 사용하기 원하는 방식이 아니며, 상자에서 꺼내기 만하면 마치 Authorize이 원하는대로 작동하는지 확인하지 않고 멈추는 것처럼 보입니다. .

답변

2

Authorize 특성은 ASP.NET ID 또는 다른 ID 시스템에 대해 아무것도 모릅니다. MVC 프레임 워크가 설정하는 IPrincipalIIdentity 인터페이스로 작동합니다.

ASP.NET ID는 ClaimsIdentity 개체를 사용하며 IIdentity을 구현합니다.

프레임 워크는 UserManager를 통해 인증 티켓을 만듭니다. 페이지가로드되면이 인증 티켓을로드하고 해독 한 다음 필요한 주체 및 ID 및 역할 개체를 만듭니다.

다음, 권한 부여는

[Authorize(Roles="Blah")]

+0

실제, 문자 그대로 진실 된 대답은 "마법"입니까? – Ciel

+1

@Ciel - 음, 나는 "문자 그대로"라고 말하지 않을 것입니다. MVC (또는 asp.net) 파이프 라인을 이해한다면 말이됩니다. 이해해야 할 핵심 사항은 Authorize가 사용하는 ID 시스템이 ASP.NET의 기본 제공 인터페이스에 일반적으로 적용되지 않는다는 점입니다. "마술"은 페이지로드시 ID가 어떻게 연결되는지에 있습니다. –

+0

롤, 나는 조금 냉소적이었다. 그것은 마술처럼 보입니다. – Ciel

3

사실 조금 더 간단합니다. 사용자가 로그인 할 때, ClaimsIdentity가 생성 될 때

var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie); 
AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity); 

역할 정보가 데이터베이스에서 읽어 ... AccountController 이러한 행은 ClaimsIdentity를 생성하고 인증 미들웨어는 쿠키를 설정합니다. 신원 (역할 포함)은 일련 화되고 쿠키로 암호화됩니다. 후속 요청에서 ClaimsIdentity은 미들웨어에 의해 쿠키에서 해독되고 역 직렬화됩니다. ID는 스레드에 연결되며 사용자가 역할에 있는지 여부를 확인하는 데 사용됩니다. 컨트롤러에서 User.Identity을 사용하여 프로그래밍 방식으로 ClaimsIdentity에 액세스 할 수도 있습니다.

+1

남자, 나는 너희들이 모두와 유지 방법을 모르는 말할 때 단지 기본적으로 User.IsInRole("Blah") 확인 때문이다. 내가 할 수있는 모든 블로그를 읽었으며 내 경험으로도이 모든 것이 아직도 내 머리 위로 간다. – Ciel

+0

@Ciel - 코드를 리버스 엔지니어링하고 Resharper와 비슷한 것을 사용하거나 코드 렛스에서 aspnetwebstack 소스를 살펴 보는 것이 도움이됩니다. –