사용자가 요청 된 페이지에 액세스 할 수 있는지 결정 하시겠습니까?
-
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") = "";
}