Jag har ett rollbaserat system. Hej Patrik Japp, det är den boken jag har utgått ifrån. Den lösningen använder sig dock inte av roller på det sättet att de låser hela mappar i web.config. Istället så ligger säkerhetskollen i Page_Load. Efter lite fix och trix har jag löst problemet. Koden som boken lägger i basklassen har jag flyttat till global.asax Application_AuthenticateRequest.Role-based authentication med custom principal
I web.config för den skyddade mappen använder jag:
<code>
<authorization>
<allow roles="SiteAdmin" />
<deny users="*" />
</authorization>
</code>
I global.asax har jag:
<code>
Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As EventArgs)
Try
If Request.IsAuthenticated Then
'Determine this user's roles
Dim nUser As UserClass = New UserClass()
nUser.LoadUsers()
nUser.Email = User.Identity.Name
nUser.LoadUser()
' Create an array of role names
Dim roleList As New ArrayList()
roleList = nUser.Roles
'Convert the roleList ArrayList to a String array
Dim roleListArray As String() = roleList.ToArray(GetType(String))
'Add the roles to the User Principal
HttpContext.Current.User = _
New GenericPrincipal(User.Identity, roleListArray)
End If
Catch exc As Exception
Response.Write(exc.Message)
End Try
End Sub
</code>
Allt är frid och fröjd och fungerar fint.
Men nu är det så att i nya versionen av min applikation så har jag valt att använda en customiserad Principal klass som implementerar IPrincipal.
Min fråga är då, när man sätter allow roles i web.config, hur kontrolleras det i den authenticerade Principal? Eftersom min customiserade Principal klass har IsInRole(role as String) funktionen så borde väl kontrollen fungera ändå?
Först så tog jag bort det som jag ovan har i global.asax men sen tänkte jag att kontrollen kanske görs innan Page_Load på sidan. Jag har nämligen en BasePage klass som sätter den authenticerade användaren till min customiserade Principal klass. Funkar inte annars eftersom den tydligen går tillbaka till en generic när man byter sida.
Då ändrade jag ovanstående i global.asax så att jag såg till att skapa min SitePrincipal i Application_AuthenticateRequest för att vara säker på att det stämde.
Men rollhanteringen funkar inte ändå.
Någon annan som pysslat med customiserade Principals och role-based?Sv: Role-based authentication med custom principal
I Wrox-boken ASP.NET Website Programming: Problem - Design - Solution, bygger man en sajt med .NET och bl a en egen IPricipal kallas SitePrincipal.
All sidor bygger på en basklass som innehåller nedanstående kod i Page_Load.
Kan det vara till hjälp månne?
( Koden finns på http://www.wrox.com/books/0764543776.shtml)
Lycka till
/Staffan
private void PhilePage_Load(object sender, System.EventArgs e)
{
// TODO: Place any code that will take place BEFORE the Page_Load event
// in the regular page, e.g. cache management, authentication verification,
// etc.
if (Context.User.Identity.IsAuthenticated)
{
if (!(Context.User is SitePrincipal))
{
// ASP.NET's regular forms authentication picked up our cookie, but we
// haven't replaced the default context user with our own. Let's do that
// now. We know that the previous context.user.identity.name is the e-mail
// address (because we forced it to be as such in the login.aspx page)
SitePrincipal newUser = new SitePrincipal( Context.User.Identity.Name );
Context.User = newUser;
}
}
}Sv: Role-based authentication med custom principal
Jag skulle helst vilja låsa adminmappen i web.config genom att ange vilka roller som har tillgång. Sedan använder jag bokens säkerhetskoll för att avgöra vilka administrationsval som är tillgängliga genom att kolla användarens permissions.
Problemet är att det verkar som att koden i basklassen inte utförs innan authenticeringen. Men det funkar inte även när jag skapar en ny customiserad Principal i global.asax.
Får experimentera lite antar jag.Sv: Role-based authentication med custom principal
Då fungerar Rollbaseringen precis som den ska. :)