Если файл cookie был записан в zzz.example.com
, то сайт на www.example.com
не может его прочитать - способ поделиться файлами cookie между поддоменами - записать их в .example.com
.
Это можно настроить в проверке подлинности с помощью атрибута domain
в элементе форм в web.config:
<forms [...]
domain=".example.com">
Обратите внимание на начальный период в доменных именах.
Изменить, чтобы ответить на комментарий
Вероятно, вам следует подключиться к событию PostAuthenticateRequest - оно запускается после установления личности пользователя (или его отсутствия), и вы можете зарегистрировать пользовательский HttpModule для получения событие.
Изменить, чтобы показать работу
Хорошо, я только что протестировал следующую настройку:
Проект веб-приложения со следующей структурой каталогов:
/Default.aspx -- Simple aspx page.
/Login.aspx -- Simple aspx page, with a Login control.
/web.config -- Main application config.
/Classes/CheckingAuthenticate.cs -- HttpModule, configured in root.
/Restricted/Default.aspx -- Simple asp page.
/Restricted/web.config -- Config file for authorization
Итак, корневой web.config устанавливает проверку подлинности с помощью форм с использованием стандартного поставщика членства ASP.NET и устанавливает /Login.aspx
в качестве страницы входа. Я также зарегистрировал там собственный HttpModule:
<httpModules>
<add name="CheckingAuthenticate"
type="TempWebApp.Classes.CheckingAuthenticate"/>
[...]
</httpModules>
web.config в /Restricted/
запрещает доступ анонимным пользователям (это можно сделать и в элементе <location>
в корне):
<configuration>
<system.web>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</configuration>
У меня в http-модуле следующий код:
using System;
using System.Web;
using System.Web.Security;
namespace TempWebApp.Classes {
public class CheckingAuthenticate : IHttpModule {
public void Dispose() {
//clean-up code here.
}
public void Init(HttpApplication context) {
context.PostAuthenticateRequest += OnPostAuthenticate;
}
public void OnPostAuthenticate(object sender, EventArgs e) {
var app = sender as HttpApplication;
if (!UrlAuthorizationModule.CheckUrlAccessForPrincipal(app.Request.Path,
app.User,
"GET")){
//Code here to read cookies, redirect user etc.
}
}
}
}
Это сработает после аутентификации пользователя, но до того, как ASP.NET попытается авторизовать пользователя, так что вы получите возможность самостоятельно проверить доступ и вместо этого перенаправить. Я был в состоянии достигнуть точек останова на этом довольно счастливо. Я не смог увидеть события AuthorizeRequest или PostAuthorizeRequest, если у пользователя не было доступа к этим страницам.