사용자가 요청 된 페이지에 액세스 할 수 있는지 결정 하시겠습니까?

StackOverflow https://stackoverflow.com/questions/1048492

  •  20-08-2019
  •  | 
  •  

문제

여러 역할이있는 ASP.NET 웹 사이트가 있으며 각각 별도의 디렉토리에 액세스 할 수 있습니다 (즉, 관리자 사용자는 공유 로그인 페이지를 사용하여 Admin 사용자가 액세스 /관리자가 액세스 할 수 있습니다. 누군가가 리턴 URL을 디렉토리로 설정 한 상태에서 로그인 페이지를 방문하면 (예 : 쇼핑객 방문 /login.aspx?returnurl=/admin/index.aspx)에 액세스 할 수없는 경우 사용자는 성공적으로 인증 할 수 있습니다 (로그인 자격 증명은 다음과 같습니다. 유효하지만 로그인 페이지로 돌아갑니다 (요청한 페이지에 액세스 할 수 없습니다).

이를 선택하려면 메시지를 표시 할 수 있으므로 사용자에게 표시 할 수 있습니까?

도움이 되었습니까?

해결책 2

로그인 페이지의 Page_load 이벤트 에서이 작업을 수행했습니다.

if (User.Identity.IsAuthenticated)
{
    LoginErrorDetails.Text = "You are not authorized to view the requested page";
}

인증 된 사용자가 로그인 페이지에서 끝나는 경우, 볼 수있는 권한이없는 페이지에 액세스하려고 시도한 결과로 보내 졌거나 인증 된 후 로그인 페이지로 수동으로 갔다. (할 것 같지 않은).

추가 조치는 이미 인증 된 경우 로그인 페이지를 방문 할 때마다 사용자를 관련 홈페이지로 보내는 것입니다.

다른 팁

UrlAuthorizationModule.CheckUrlAccessForPrincipal()

위치 (페이지 또는 폴더)에 대한 사용자 액세스를 테스트하는 데 사용해야하는 것입니다. http://msdn.microsoft.com/en-us/library/system.web.security.urlauthorizationmodule.checkurlaccessforprincipal.aspx )

한 가지 방법은 ASPX 양식의 온부하를 무시하고 인증 된 사용자가 역할에 따라 리소스에 액세스 할 수 있는지 확인하는 것입니다. 따라서 Basepage.cs (System.web.ui.page에서 상속되는 클래스 기지를 정의 함)를 만듭니다.

protected override void OnLoad(EventArgs e)
{
    InitializeSitemap();
    if (SiteMap.CurrentNode != null)
    {
        if (!UrlHelper.IsAnonymousAllowed(SiteMap.CurrentNode) && (!HttpContext.Current.User.Identity.IsAuthenticated || !UrlHelper.IsAccesible(SiteMap.CurrentNode)))
        {
            // You can redirect here to some form that has a custom message
            Response.Redirect("~/Forms/Logout.aspx");

            return;
        }
    }
    base.OnLoad(e);
}

그런 다음 URLHELPER 클래스에서 위에 사용 된 직접적인 기능이 필요합니다.

public static bool IsAccesible(SiteMapNode node)
{
    bool toRole = false;

    foreach (string role in node.Roles)
    {
        if (role == "*" || HttpContext.Current.User.IsInRole(role))
        {
            toRole = true;
        }
    }

    return toRole;
}

당신이 궁금해 할 경우를 대비하여 iSanonymousallowed입니다.

public static bool IsAnonymousAllowed(SiteMapNode node)
{
    return node[AllowAnonymousAttribute] != null ? bool.Parse(node[AllowAnonymousAttribute]) : false;
}

디렉토리가 다르고 ASP.NET 인증을 사용하는 경우 매우 쉽습니다. Web.config 파일을 각 디렉토리에 넣고 해당 디렉토리의 파일에 액세스 할 수있는 역할을 정의하는 것입니다.

<authorization>
    <allow roles="shoppers"/>
    <deny  users="?"/>
</authorization>

자세한 내용은 자세한 내용을 얻을 수 있습니다 이것 MSDN에 관한 기사

다음과 같이 메인 웹에서 모든 것을 설정할 수 있습니다.

    <!-- Configuration for the "sub1" subdirectory. -->
      <location path="sub1">
        <system.web>
          <httpHandlers>
            <add verb="*" path="sub1" type="Type1"/>
            <add verb="*" path="sub1" type="Type2"/>
          </httpHandlers>
        </system.web>
      </location>

      <!-- Configuration for the "sub1/sub2" subdirectory. -->
      <location path="sub1/sub2">
        <system.web>
          <httpHandlers>
            <add verb="*" path="sub1/sub2" type="Type3"/>
            <add verb="*" path="sub1/sub2" type="Type4"/>
          </httpHandlers>
        </system.web>
      </location>
    </configuration>

이것은 왔습니다 이것 MSDN에 관한 기사 :)

편집하다:

페이지로드 방법에서 다음을 수행합니다.

if(!User.IsInRole("shopper"))
{
    lblNoAccess.Visible=true;
    lnkHome.Url="PATH_TO_HOME_PAGE_OF_THIS_ROLS";
}

이것이 도움이되기를 바랍니다!

인덱스 페이지에서 그를 리디렉션하여 해당 페이지에 액세스 할 수 없다고 말할 수 있습니다.)

글쎄, 로그인 페이지에서 디렉토리를 잡지 그래? 로그인 페이지에서 사용자가 액세스하려는 디렉토리를 결정할 수있는 경우 역할에 따라 오른쪽 페이지로 리디렉션 될 수 있습니다. 누군가가 /관리자에게 가려고하고 인증이 성공하면, 액세스 권한이 있는지 확인할 수 있습니다. 그렇지 않은 경우, 액세스 권한이 없음을 나타내는 기본 방문 페이지로 리디렉션하거나 역할의 방문 페이지로 리디렉션 할 수 있습니다.

편집 : 컨트롤의 로그인 이벤트에서 리디렉션을 수행 할 수 있습니다.

다른 옵션 중 하나는 권한을 확인할 때 세션 변수를 설정하고 로그인 페이지에 표시하는 것입니다.

그래서 당신은 할 수 있습니다 :

if(!User.IsInRole("shopper"))
{
    session("denied") = "You don't have access to shop";
    response.redirect("/login");
}

그런 다음 로그인 페이지에서 :

if ( session("denied") != "" ) {
   message.text = session("denied");
   session("denied") = "";
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top