Я смешиваю классическую настройку безопасности Membership / RoleManager с новым WIF 4.5 API для целей тестирования. Я реализовал два класса, для которых установлены точки останова:
public class CustomAuthenticationManager : ClaimsAuthenticationManager
{
public override ClaimsPrincipal Authenticate(string resourceName, ClaimsPrincipal incomingPrincipal)
{
// Breakpoint here is hit 1st
if (!incomingPrincipal.Identity.IsAuthenticated)
{
return base.Authenticate(resourceName, incomingPrincipal);
}
return TransformPrincipal(incomingPrincipal);
}
private ClaimsPrincipal TransformPrincipal(ClaimsPrincipal incomingPrincipal)
{
// this breakpoint is hit last
ClaimsIdentity newIdentity = new ClaimsIdentity("Custom");
newIdentity.AddClaims(incomingPrincipal.Claims);
// I add some additional claims
ClaimsPrincipal newPrincipal = new ClaimsPrincipal(newIdentity);
return newPrincipal;
}
}
public class CustomRoleProvider : RoleProvider
{
public override string[] GetRolesForUser(string username)
{
// breakpoint here is hit 2nd
if(username == "me") return new string [] { "Lead", "Developer" };
return new string[] {};
}
#region Not implemented
// bunch of not implemented methods
#endregion
}
Теперь результат в порядке, я получаю смешанный ClaimsPrincipal, который имеет как утверждение Name, так и утверждения роли и утверждения, которые я добавил в метод TransformPrincipal.
Однако точки останова отладки достигаются в совершенно странном порядке:
1) Сначала достигается точка останова в начале метода аутентификации
2) Точка останова в начале GetRolesForUser достигается второй
3) остановка в начале TransformPrincipal выполняется последней.
Это просто проблема Visual Studio или есть небольшая вероятность того, что проверка подлинности может завершиться до вызова GetRolesForUser?
Как RoleManagerModule и ClaimsAuthenticationManager работают в конвейере? Параллельно или идет последовательный порядок? Может ли смешивание двух составлять проблемы?
РЕДАКТИРОВАТЬ:
void Application_PostAuthenticateRequest(object sender, EventArgs e)
{
ClaimsPrincipal transformedPrincipal = FederatedAuthentication.FederationConfiguration.IdentityConfiguration.ClaimsAuthenticationManager.Authenticate(null, ClaimsPrincipal.Current);
Thread.CurrentPrincipal = transformedPrincipal;
HttpContext.Current.User = transformedPrincipal;
}
РЕДАКТИРОВАТЬ:
<membership defaultProvider="CustomMembershipProvider">
<providers>
<add name="CustomMembershipProvider" type="Tests.CustomMembershipProvider" />
</providers>
</membership>
<roleManager enabled="true" defaultProvider="CustomRoleProvider">
<providers>
<add name="CustomRoleProvider" type="Tests.CustomRoleProvider" />
</providers>
</roleManager>
<authentication mode="Forms">
<forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>
<system.identityModel>
<identityConfiguration>
<claimsAuthenticationManager type="Tests.CustomAuthenticationManager, Tests"/>
</identityConfiguration>
</system.identityModel>