Certamente. Il web.config è estendibile con altre sezioni di configurazione, come per esempio vedi in
questo articolo di Daniele.
Il primo passo consiste nel creare una classe che definirà e riceverà i valori letti dalla nostra sezione personalizzata del web.config. Nel mio esempio ho aggiunto giusto le proprietà LoginUrl e Timeout (per nostalgia ho scelto i nomi che abbiamo usato fino a ieri con la forms authentication).
Imports Microsoft.Owin
Imports System.ComponentModel
Public Class AspNetIdentitySection
Inherits ConfigurationSection
<TypeConverter(GetType(ConvertitorePathString))> _
<ConfigurationProperty("loginUrl", DefaultValue:="/Login", IsRequired:=False)> _
Public Property LoginUrl() As PathString
Get
Return Me("loginUrl")
End Get
Set(ByVal value As PathString)
Me("loginUrl") = value
End Set
End Property
<TypeConverter(GetType(ConvertitoreTimeSpan))> _
<ConfigurationProperty("timeout", DefaultValue:="20", IsRequired:=False)> _
Public Property Timeout() As TimeSpan
Get
Return Me("timeout")
End Get
Set(ByVal value As TimeSpan)
Me("timeout") = value
End Set
End Property
Private Class ConvertitorePathString
Inherits ConfigurationConverterBase
Public Overrides Function CanConvertFrom(ctx As ITypeDescriptorContext, type As Type) As Boolean
Return type.Equals(GetType(String))
End Function
Public Overrides Function ConvertFrom(context As ITypeDescriptorContext, culture As Globalization.CultureInfo, value As Object) As Object
Return New PathString(value)
End Function
End Class
Private Class ConvertitoreTimeSpan
Inherits ConfigurationConverterBase
Public Overrides Function CanConvertFrom(ctx As ITypeDescriptorContext, type As Type) As Boolean
Return type.Equals(GetType(String))
End Function
Public Overrides Function ConvertFrom(context As ITypeDescriptorContext, culture As Globalization.CultureInfo, value As Object) As Object
Return TimeSpan.FromMinutes(Integer.Parse(value))
End Function
End Class
End Class
Come vedi, le due proprietà sono - rispettivamente - di tipo PathString e TimeSpan. Le ho progettate così perché sono proprio i tipi che mi servono quando andrò ad assegnare i loro valori alle proprietà del CookieAuthenticationOptions.
Ho dovuto usare dei convertitori (ConvertitorePathString e ConvertitoreTimeSpan) perché i valori che mi arrivano dal web.config sono sostanzialmente delle stringhe e non sono implicitamente convertibili in quei tipi.
Ecco come ottengo un riferimento alla sezione personalizzata e ne uso i valori che mi arrivano dal web.config.
Dim identityConfiguration As AspNetIdentitySection = CType(ConfigurationManager.GetSection("aspNetIdentity"), AspNetIdentitySection)
'Questo è il punto nel file /App_Start/Startup.Auth.vb in cui configuro la cookie authentication
app.UseCookieAuthentication(New CookieAuthenticationOptions() With {
[...omissis...]
.LoginPath = identityConfiguration.LoginUrl,
.ExpireTimeSpan = identityConfiguration.Timeout
})
Infine, nel web.config la sezione è registrata ed usata così:
<configuration>
<configSections>
<!-- qui la registro -->
<section name="aspNetIdentity" type="MiaWebApp.AspNetIdentitySection, MiaWebApp" />
</configSections>
<!-- qui la uso -->
<aspNetIdentity timeout="60" loginUrl="/Account/Login" />
...
</configuration>
ciao,
Moreno
Modificato da BrightSoul il 23 febbraio 2015 21.29 -