2012-11-30 1 views
6

.NET MVC4 프로젝트에서 SimpleMembership을 사용하고 있습니다. 개발하는 동안 수동으로 데이터베이스를 조작/재 구축하는 동안 생산 단계에서는 거의 찾아 볼 수없는 오류가 발생했습니다. 그러나이를 해결하고이를 처리 할 수있는 적절한 방법을 찾을 수 없습니다..NET MVC4 SimpleMembership 오류 - "xxx 이름의 사용자를 찾을 수 없습니다"

응용 프로그램에 로그인 한 후 데이터베이스에서 사용자 이름이 변경되거나 사용자 레코드가 완전히 삭제되면 사용자는 더 이상 응용 프로그램의 모든 페이지에 액세스 할 수 없게됩니다. 익명보기 및 로그인 화면이 있습니다. 대신 예외가 throw됩니다. "사용자 이름이 'username'인 사용자를 찾을 수 없습니다.

내 애플리케이션의 모든 페이지는 로그인/로그 오프 제어를 렌더링하는 부분보기를 표시합니다. Request.IsAuthenticated는 데이터베이스의 내용에 관계없이 true를 반환합니다. 앱이 사용자가 여전히 쿠키의 정보를 기반으로 로그인했지만 데이터베이스에 해당 레코드가 없다고 생각하는 것 같습니다. 인증 쿠키를 지우면 해결되지만,이 문제가 발생했을 가능성이있는 사용자에게 제공하려는 지침은 아닙니다.

현재 해결 방법은 Global.asax에서 해당 예외를 찾아서 쿠키를 지우고 로그인 페이지로 리디렉션하는 것입니다. 이것은 나에게 완전히 해커처럼 보인다.

누구나이 시나리오에서 더 좋은 해결책이 있습니까? 이전 .NET 멤버쉽 공급자를 사용하는 것과 같은 문제가 발생하지 않았습니다 ... 내 기대는이 상황을 즉시 처리해야하며 레코드를 변경하지 않아도됩니다./DB에서 삭제되면 사용자는 인증에 실패하고 자동으로 로그인 페이지로 리디렉션되어야합니다.

답변

1

DB 캐시 또는 로그인 후 사용자 레코드의 종속성, 종속성, 체인 삭제 여부 또는 종속성 삽입으로 인해 발생할 수있는 페이지를 확인할 수 있습니까?

-1

이것은 당신이 다른 호스트로 환경을 어플의 개발자 전환 할 때 발생하는 것 같다 .. 그것을 확인하시기 바랍니다 또는 코드를 공유하시기 바랍니다. localhost가 로그인 쿠키를 기억하고 새로운 간단한 멤버 데이터베이스에 대해 사용하려고합니다.

당신이 말했듯이 프로덕션에서는 발생하지 않습니다. 미안 로컬 및 프로덕션 데이터베이스 모두에서 동일한 로그인을 사용하지 않는 것이 더 좋은 방법이라는 것을 알지 못합니다. throw 된 예외가 단지 System.InvalidOperationException이기 때문에 거기,

protected void Application_Error(object sender, EventArgs e) 
    { 
     Exception ex = Server.GetLastError(); 

     if (ex.Message.Contains("No user found was found that has the name")) 
     { 
      FormsAuthentication.SignOut(); 
      Response.Redirect(Request.RawUrl); 
     } 
    } 

: Global.asax.cs에서

:

+0

글쎄 난 아직 상상 프로덕션 환경에서는 수동으로 데이터베이스의 레코드를 삭제하지 않기 때문에 발생하지 않을 가능성이 높습니다. 그것은 호스트를 바꾸는 문제가 아닙니다. 나는 이것을 극복하는 방법을 찾기 위해 더 많은 시간을 소비하지는 않았지만 기본적으로 데이터베이스에 더 이상 존재하지 않는 사용자를 참조하는 브라우저의 인증 쿠키와 관련이있다. 더 우아하게 상자 밖으로. – Gadget27

1

여기에 먼저 인증 논리를 가지고 있지만, 어디 확실하지 내가 할 것입니다 별로 그럴 수는 없습니다. 그다지 현명하지는 않지만해야 할 일이 있습니다. IsUserInRole(...) 같은 어떤 인증 로직이 없습니다 또한, 페이지에서 리디렉션하고 있는지 확인하면 예 당신은 싶어 내가있는 동안 try{} catch(){}

1
나는 문제의 동일한 종류를 가졌다

, IsAuthenticatedtrue 반환에 포장 할 수 MVC 4 사이트에 로그인하지 않아 동일한 오류 메시지가 나타납니다. 우리의 솔루션에서 SimpleMembership이있는 MVC 4 개의 사이트가 2 개 있었고 두 번째 사이트를 디버깅하는 동안 첫 번째 사이트에 로그인 한 것으로 나타났습니다. 두 포트 모두 localhost en의 다른 포트에서 실행되므로 쿠키가 설정되면 가져 오는 쿠키와 동일한 인증 쿠키를 설정해야합니다.인증 쿠키 설정 방법을 변경해야 할 것입니다.

다른 문제가있을 수 있지만 제 "해결책"이이 문제를 가진 사람을 도울 수 있다고 생각합니다.

+1

이 솔루션은 저에게 효과적이었습니다. 다른 사이트에서 로그인했는데 사이트 전환시이 오류가 발생했습니다. 캐시/쿠키를 삭제하면 정상적으로 작동합니다. –

0

무시 AuthorizeAttribute : 그것은 현재 페이지로 리디렉션하기 전에 당신을의 로그 그래서 내가 아르 멘 Bimatov 응답에 추가 한

public sealed class AuthorizeAttribute : System.Web.Http.AuthorizeAttribute 
{ 
    protected override bool IsAuthorized(HttpActionContext actionContext) 
    { 
    try 
    { 
     return base.IsAuthorized(actionContext); 
    } 
    catch 
    { 
     return false; // user name from cookie is no longer in db 
    } 
    } 

    protected override void HandleUnauthorizedRequest(HttpActionContext actionContext) 
    { 
    // handle this exception by global exception filter for redirection to login 
    throw new CustomAuthException(); 
    } 
} 
0

. 현재 페이지로 리디렉션하면 returnURL이 쿼리 문자열에 올바르게 배치됩니다. Global.asax.cs에서

그러나

 
protected void Application_Error(object sender, EventArgs e) 
    { 
     Exception ex = Server.GetLastError(); 

     if (ex.Message.Contains("No user found was found that has the name")) 
     { 
     FormsAuthentication.SignOut(); 
     Response.Redirect(Request.RawUrl); 
     } 
    } 

, 당신은이 질문에 따라 귀하의 Web.config에 CustomerErrors 섹션이 없으면이 작동하지 않습니다 global.asax Application_Error not firing

+0

http://stackoverflow.com/questions/3713939/global-asax-application-error-not-firing –