2

사용자 지정 멤버 자격 및 역할 공급자에 대한 고유 한 클래스를 개발했습니다.IIS 및 사용자 지정 멤버 자격 공급자 + 사용자 지정 역할 공급자 관련 문제

모든 것이 로컬로 작동합니다. 그럼에도 불구하고 테스트를 위해 IIS에 솔루션을 배포 한 후 로그인 동작이 작동하는 것 같습니다 (최소한 사용자 이름 + 비밀번호의 유효성을 검사하고 사용자가 인증 된 것처럼 보임)하지만

과 같은 주석으로 장식 된 작업에 액세스하려고 할 때
[Authorize(Roles="Employee, Admin")] 

마치 사용자가 필요한 역할을하지 않은 것처럼 계속 로그인 페이지로 리디렉션됩니다.

로컬에서는 응용 프로그램이 사용자를 확인하고 작업을 실행하기 전에 인증 된 사용자의 역할을 확인하는 데 성공하므로 (즉, 두 클래스 모두 내 메서드가 올바른 것으로 가정합니다) IIS에서 역할 공급자가 제대로 작동하지 않는 것처럼 보입니다 . 누구나 내가 어디에서 잘못 될 수 있는지 또는 내 문제에 대해 어떻게 더 잘 볼 수 있습니까? 내있는 Web.Config에서

: 사전에

<system.web> 
(...) 
<authentication mode="Forms"> 
    <forms loginUrl="~/Account/Login" timeout="2880" /> 
</authentication> 
<membership defaultProvider="CustomMembershipProvider"> 
    <providers> 
    <clear /> 
    <add name="CustomMembershipProvider" type="MyApplication.Infrastructure.CustomMembershipProvider" connectionStringName="DBEntities" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" /> 
    </providers> 
</membership> 
<roleManager enabled="true" defaultProvider="CustomRoleProvider"> 
    <providers> 
    <clear /> 
    <add name="CustomRoleProvider" type="MyApplication.Infrastructure.CustomRoleProvider" connectionStringName="DBEntities" applicationName="/" /> 
    </providers> 
</roleManager> 
(...) 
</system.web> 

감사합니다.

편집 : Aditional Info.

  • 난 그냥 내 행동 '말뭉치 주석 중 하나가 단순히 [권한 부여]와 작동하도록 수정. 따라서 인증이 작동하고 문제가 역할 공급자와 관련되어야한다고 생각합니다.

  • 저는 데이터 모델에 Entity Framework를 사용하고 있습니다. 다음과 같이 문자열은 다음과 같습니다 (?)

  • 내가 사용자를 등록하고 DB 연결 및 사용자 지정 멤버 자격 공급자가 제대로 작동하는지 의미가 새로 만든 계정의를 사용하여 로그인 할 수 있었다. {@ str을}

  • A "@foreach (Roles.GetRolesForUser (User.Identity.Name)에서 문자열 STR)는 로컬 역할을 인쇄하고 배포하면 아무 것도 인쇄되지 않습니다. 내가 가진

+0

연결 문자열이 있습니까? – Fals

+1

역할이 존재하고 사용자가 자신의 역할에 할당되었는지 확인하십시오. –

+0

네, 그냥 두 번 확인했습니다. 로컬로 테스트 할 때 사용하는 DB 인스턴스는 IIS에 배포 할 때 사용되는 것과 동일합니다. 따라서 역할이 존재하고 지역적으로 인정받는다면 문제는 없어야합니다. – user1987392

답변

1

좋아, 내가 그것을 고정 다음의 경우 사람의 설명은 미래에 그것을 필요로이다 :..

NA 후 원인을 (내 편집 내용에서 알 수 있듯이) 풀어 내고, 문제가 내 CustomRoleProvider와 관련이 있어야한다는 것을 알았습니다.

public override string[] GetRolesForUser(string Username) 
    { 
     List<string> roles = new List<string>(); 

     using (DBEntities _db = new DBEntities()) 
     { 
      try 
      { 
       var dbRoles = from r in _db.UserRole 
           where r.Users.Username == Username 
           select r; 

       foreach (var role in dbRoles) 
       { 
        roles.Add(role.Role.Name); 
       } 
      } 
      catch 
      { 
      } 
     } 

     return roles.ToArray(); 
    } 

그래서 나는 예외를 잡기 그것으로 아무것도하지 않은 :

그 클래스는이 같은 방법이 있습니다.나는 시도-catch 블록을 제거하고이 메시지를 받았습니다 :

There is already an open DataReader associated with this Command which must be closed first. 

stackoverflowing의 비트와 나는이 발견 There is already an open DataReader associated with this Command which must be closed first

밝혀 내 로컬 연결 문자열 MultipleActiveResultSets=true했지만, 내 제작 설정에서 연결 문자열 하지 않았다. 내 제작 설정을 수정하고 보일 듯, 지금 일하는 것 같습니다.

나는 그 설정을하는 것의 장점/단점을 실제로 알지 못한다.하지만 실제로 작동하고 있으며 나는 계속 나아갈 필요가있다. 어쨌든 모두 도와 주셔서 감사합니다.

+0

자신의 답변을 게시하는 경우 답변으로 받아 들여야합니다. –

+0

크리스, 안녕하세요.하지만 2 일 정도 기다려야합니다. :) – user1987392

0

. 유사한 문제가 machineKey은 web.config 파일 추가 한 후 모든 것이 잘 작동했다

<system.web> 
<machineKey validationKey="2E417D4AC04F20FA6CE1CF1EFE23FBF1695BF6981B605B1B8628D2182C43D0B10E48C4A83FDCE0D1D6300095D9EE1B8746A37E2C3256554405983DCAA7622875" decryptionKey="FA6D35C22BF7E5E9E4438052B924CCC017521137C5EB017D07C7038B80C5F726" validation="SHA1" decryption="AES" /> 
    </system.web> 
+0

안녕하세요. 난 그냥 (이 링크의 도움으로 노력 : http://www.codeproject.com/Articles/221889/How-to-Generate-Machine-Key-in-IS7)하지만 슬프게도 작동하지 않았다. – user1987392