Azure ACS, WIF 3.5, пользовательский поставщик членства Asp.Net 3.5 и IsAuthenticated

Следуя инструкциям этого руководства Использование Azure ACS У меня есть работающая служба Azure ACS, настроенная и аутентифицируемая через Facebook, с перенаправлением обратно на веб-сайт, работающий на моем сервере разработки.

При успешной аутентификации Azure ACS перенаправляет обратно на мой локальный веб-сайт разработки, и флаг IsAuthenticated имеет значение true, однако я хочу установить для флага IsAuthenticated значение true, только если электронное письмо из заявки также существует в моей локальной базе данных, через проверку / вызов пользовательский MembershipProvider. Если письма с заявкой не существует, я хочу перенаправить клиента на страницу регистрации. После регистрации и аутентификации я хотел бы установить для флага IsAuthenticated значение true.

В настоящее время после проверки подлинности с помощью Facebook и AzureACS пользователь может запросить защищенную страницу, такую ​​как ViewAccountBalance.aspx, даже если учетная запись не существует, поскольку изначально для флага IsAuthenticated установлено значение true. Интересно услышать, что сделали другие и каковы лучшие практики.


person Andre    schedule 18.04.2012    source источник


Ответы (2)


Вам нужно будет четко различать аутентификацию и авторизацию. Поскольку пользователь вошел в систему через Facebook, это означает, что он аутентифицирован (вы знаете, кто он и откуда).

Теперь, если вы хотите ограничить части приложения на основе определенного условия, вы на самом деле говорите об авторизации. Вы можете подумать об объединении ролей с помощью простого HttpModule. Пример: ваш HttpModule может проверить, какую страницу просматривает пользователь. Если пользователь получает доступ к странице, для которой требуется активный профиль, вы можете использовать следующий код:

public class RequiresProfileHttpModule : IHttpModule
{
    public void Dispose()
    {

    }

    public void Init(HttpApplication context)
    {
        context.AuthorizeRequest += new EventHandler(OnAuthorize);
    }

    private void OnAuthorize(object sender, EventArgs e)
    {
        HttpApplication app = sender as HttpApplication;
        if (app.Request.Url.ToString().Contains("bla") && !app.Context.User.IsInRole("UsersWithProfile"))
            app.Response.Redirect("http://myapp/register.aspx");
    }
}

Единственное, о чем вам нужно позаботиться, - это обновить принципала, чтобы убедиться, что он имеет роль UsersWithProfile, если пользователь ввел свой адрес электронной почты.

Это лишь одно из многих возможных решений. Если вы используете ASP.NET MVC, вы можете добиться того же результата с помощью глобальных фильтров ActionFilters. Или вы также можете попробовать работать с IClaimsPrincipal (добавьте утверждение, если у пользователя есть профиль).

person Sandrino Di Mattia    schedule 18.04.2012
comment
В OnInit () Global.asax я добавил: this.PostAcquireRequestState + = (s, e) = ›SecurityHelper.PostAcquireRequestState (); Затем в SecurityHelper.PostAcquireRequestState у меня есть логика, чтобы проверить, защищена ли страница стандартным FormsAuth, аналогично (stackoverflow.com/questions/3390719/). Я также выполняю поиск через Membership.GetUser и проверяю, существует ли учетная запись, в противном случае я перенаправляю на страницу регистрации. - person Andre; 19.04.2012

Сандрино прав. Вы можете использовать авторизацию на основе ролей (или, в более общем смысле, авторизацию на основе утверждений). По умолчанию ACS просто возвращает утверждения, выданные поставщиками удостоверений, вашей проверяющей стороне. Facebook вернет заявку по электронной почте. Однако вы можете настроить ACS для создания дополнительных правил. Например, вы можете сопоставить определенных пользователей с ролью, значение которой - администратор. Затем ACS также вернет эту заявку на роль вашей проверяющей стороне. Затем вы можете воспользоваться предложением Сандрино использовать авторизацию на основе ролей. Вы также можете обратиться к http://msdn.microsoft.com/en-us/library/windowsazure/gg185915.aspx для получения дополнительной информации.

person Ming Xu - MSFT    schedule 18.04.2012