Asp.net MVC - сопоставить удостоверение личности пользователя с пользовательской идентификацией - PullRequest
2 голосов
/ 26 сентября 2011

Я пытаюсь выяснить, где находится лучшая точка расширения в инфраструктуре ASP.NET MVC3 для сопоставления пользовательских пользовательских данных (загруженных из локальной базы данных) после получения проверки подлинности на основе утверждений из Azure AccessControl Service 2.0

Я пытался добиться этого путем переопределения метода Authenticate класса Microsoft.IdentityModel.Claims.ClaimsAuthenticationManager:

public class ClaimsTransformationModule : ClaimsAuthenticationManager
{
    public override IClaimsPrincipal Authenticate(string resourceName, IClaimsPrincipal incomingPrincipal)
    {
        // Load User from database and map it to HttpContext
        // Code here

        return base.Authenticate(resourceName, incomingPrincipal);
    }
}

Однако, кажется, что этот метод вызывается более одного раза во время запроса загрузки страницы. Загрузка пользовательской информации здесь может привести к проблемам с производительностью. Я хотел бы загрузить их только один раз за сеанс с проверкой подлинности.

Есть ли лучшее место для этого? Возможно где-то на более низком уровне, где построен IClaimsPrincipal?

Ответы [ 3 ]

2 голосов
/ 28 сентября 2011

Вам просто нужно выполнить проверку isAuthenticated:

if (incomingPrincipal.Identity.IsAuthenticated)
{
   // Load User from database and map it to HttpContext
   // Code here
}

Это будет выполнено только один раз после первой аутентификации пользователя.

1 голос
/ 24 сентября 2012

Это выполняется только один раз, когда пользователь входит в систему.

public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            AuthConfig.RegisterAuth();
            FederatedAuthentication.WSFederationAuthenticationModule.SecurityTokenValidated += WSFederationAuthenticationModule_SecurityTokenValidated;
        }

        void WSFederationAuthenticationModule_SecurityTokenValidated(object sender, SecurityTokenValidatedEventArgs e)
        {
            IClaimsPrincipal principal = e.ClaimsPrincipal;
            IClaimsIdentity identity = (IClaimsIdentity)principal.Identity;

            try
            {
                //SQL connection / Claims injeciotn
                if (principal.Identity.IsAuthenticated)
                {
                   // identity.Claims.Add(new Claim(ClaimTypes.Role, "WebAdmins"));
                }

            }
            catch
            {
                //Error
            }
        }
    }
0 голосов
/ 27 сентября 2011

Любая пользовательская информация, которая не поступает от STS, является спутниковой информацией о пользователе.Поэтому было бы лучше представить это с помощью инфраструктуры Asp .Net ProfileProvider.

Обновление:

Еще одна вещь, которую вы можете сделать, это реализовать простую Custom STS, которая добавитваши пользовательские претензии, поступающие из вашей БД, во входящие претензии.Ваш пользовательский STS будет доверять ACS и будет принимать токены SAML, и это будет доверять вашему веб-приложению.

Еще одна вещь, которую я не пробовал, - попытка подделать претензии, поступающие от STS.Одна вещь, которую вы можете попробовать - это зарегистрироваться в событии SecurityTokenValidated WSFederationAuthenticationModule.В этом случае вы можете попытаться добавить свои дополнительные утверждения в ClaimsPrincipal события arg.

Это событие должно быть вызвано до создания токена сеанса, поэтому вы должны искать db один раз для каждого входа в систему.

ура,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...