Да, это немного раздражает.Возможно, у кого-то есть более простая идея, но решение (хак?), Которое мы придумали, заключалось в поиске первоначально запрошенного URL-адреса, который ASP.NET добавляет в строку запроса, когда пользователь перенаправляется на страницу входа.
Мы создали новый раздел web.config, в котором хранится набор ключей / значений, соответствующих фрагменту URL перенаправления для сообщения авторизации:
<configSections>
<section name="authorizationFailureMessages" type="System.Configuration.NameValueSectionHandler, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
...etc...
</configSections>
<authorizationFailureMessages>
<add key="MemberResources" value="MembershipRequired" />
<add key="Staff" value="StaffOnly" />
<add key="Departments/Administration/BoardOfDirectors" value="BoardOfDirectorsOnly" />
...etc...
</authorizationFailureMessages>
В событии Page_Load ()на странице Login.aspx мы вызываем метод, который использует этот URL-адрес для определения того, какое (не) событие авторизации произошло, а затем перенаправляет их на страницу сообщения, которая отображает соответствующий текст:
private void DisplayAppropriateAuthorizationMessage ()
{
if ( !Page.User.Identity.IsAuthenticated )
return;
string redirectUrl = FormsAuthentication.GetRedirectUrl( Page.User.Identity.Name, false );
if ( string.IsNullOrEmpty( redirectUrl ) )
return;
NameValueCollection authorizationFailureMessages = ConfigurationManager.GetSection( "authorizationFailureMessages" ) as NameValueCollection;
if ( authorizationFailureMessages == null )
return;
foreach ( string key in authorizationFailureMessages.AllKeys )
{
if ( redirectUrl.Contains( key ) )
{
Response.Redirect( String.Format( "Message.aspx?{0}={1}", Constants.QueryStringKeys.ERRORMESSAGENAME, authorizationFailureMessages[ key ] ), true );
}
}
}