2014-01-31 14 views
4

지난 2 일 동안 기존 데이터베이스로 새 ASP.NET ID 시스템을 연구 및 구현하는 데 막 방금했습니다. 여기에 대한 자세한 내용은 Integrating ASP.NET Identity into Existing DbContext입니다.역할 공급자에 대한 ASP.NET ID 사용 용이

이제는 UserStoreRoleStore을 사용하고 있지만, ASP.NET MVC 5 응용 프로그램에서 모든 ID 샘플과 같이 많은 양의 코드를 작성하지 않으면이를 활용하는 방법을 알아낼 수 없습니다. 저를 혼란스럽게합니다.

1) 쿠키를 사용하여 권한을 유지하고 2)보기 및 컨트롤러에서 렌더링되는 내용 모두에서 응용 프로그램 액세스를 제한하는 역할을 사용합니다.

권한있는 사용자를 나타내는 Controller.User 속성을 사용하여 해당 역할을 분명히 사용해야하는 사용자를 사용할 수있게하려면 다음을 수행하십시오. 어떻게하면 내 Identity 구현을 구현할 수 있습니까?

마지막으로, Identity 샘플에서 나는 그들이 얻는 종류의 OWIN을 사용하고 있지만 이것이 제대로 구현하는 방법을 얻지 못하는 슈퍼 로터리 방식 인 것 같습니다. 클레임에 관한 한, 그들은 내가 이해하는 것보다 두 배나 나를 혼란스럽게합니다.

나는 올바른 방향으로 모든 포인터를 주시면 감사하겠습니다.

답변

2

이렇게 돌아가 보니 간단히 작동하는 해결책을 찾은 것 같습니다. OWIN 용 시작 구성 클래스를 작성했습니다. OWIN은 미들웨어이므로 요청을 가로 채고 인증 (있는 경우)을 확인하고 UserClaimsIdentity 클래스의 인스턴스 인 Controller 클래스의 User 속성을 업데이트합니다.

그 밖의 모든 기능은 일반적으로 ASP.NET의 User 속성을 사용하는 것처럼 작동합니다. 나는 User 속성을 구문 분석하여 데이터베이스에 사용 된 실제 ID를 얻는 UserId이라는 추가 속성으로 기본 컨트롤러를 확장했습니다. 내 의도는 내 DbContext이 사용하는 실제 Employee 클래스를 쿼리 할 때 해당 ID를 사용할 수있게하려는 것입니다.

다음
public sealed class StartupConfig { 
    public void Configuration(
     IAppBuilder app) { 
     this.ConfigureAuthentication(app); 
    } 

    public void ConfigureAuthentication(
     IAppBuilder app) { 
     app.UseCookieAuthentication(new CookieAuthenticationOptions { 
      AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
      LoginPath = new PathString("/"), 
      ExpireTimeSpan = new TimeSpan(0, 60, 0) 
     }); 
    } 
} 

내가 내 UserId 속성을 구성하는 방법은 다음과 같습니다 : 그 말은 시간에, 유지 또는하지 않을 경우 우리는 여기 내 StartupConfiguration에 대한 코드입니다, 볼

protected int UserId { 
    get { 
     return Convert.ToInt32(base.User.Identity.GetUserId()); 
    } 
} 

을 장식하는 것을 잊지 마세요 [assembly: OwinStartupAttribute(typeof(namespace.StartupConfig))] 인 수업입니다. 희망이 사람을 도움이됩니다.

+0

"데이터베이스에서 사용중인 실제 ID를 얻기 위해 사용자 속성을 파싱하는 UserId라는 추가 속성으로 기본 컨트롤러를 확장했습니다."- OWIN은 GetUserId라는 IIdentity 확장 메서드를 사용하여이를 가져옵니다. 사용자가 주체를 요구합니다. 기본 컨트롤러가 필요하지 않습니다 ... – danludwig

+0

True, 나는 그것을 사용하지만 컨트롤러에서'base.UserId'를 호출하는 것이 더 쉽습니다. 필요한만큼 전달하십시오. 'User'를'ClaimsPrincipal'으로 형변환하고, 필요할 때마다'GetUserId()'메소드를 호출하는 코드를 끊임없이 다시 쓰는 것보다 훨씬 쉽습니다. 위의 내 업데이트를 확인하십시오. – Gup3rSuR4c

+0

사용자를 ClaimsPrincipal에 전송할 필요가 없습니다. 'User.Identity.GetUserId()'가 작동합니다. 확장 메서드는 IIdentity에 있으므로 IPrincipal에 종속되지 않습니다. 나는 당신이 int 캐스팅에 대해 무슨 뜻인지 알고 있지만, 우리는 그것에 대한 별도의 확장 메서드가 있습니다. 그들은 그 방법을 일반화해야합니다 ... – danludwig

1

웹 구성에 응용 프로그램 이름을 넣었습니까?

<roleManager enabled="true"> 
    <providers> 
     <clear /> 
     <add connectionStringName="ApplicationServices" 
      name="AspNetSqlRoleProvider"  
      type="System.Web.Security.SqlRoleProvider" 
      applicationName="DONT FORGET THIS PART" /> 
    </providers> 
</roleManager>  

를 사용하여 컨트롤러에서 다음 중 하나.

[Authorize] //Anyone with authorization 
[Authorize(Roles="Administrator")] //Admin role only 

또한 같은 것을 할 수 있습니다.

HttpContext.User.IsInRole("Administrator") 
UserManager.IsInRole(userID, "Administrator") 
관련 문제