2012-04-18 1 views
1

Следуя инструкциям в этом руководстве Using Azure ACS У меня работает служба Azure ACS, настроенная &, аутентифицируясь через Facebook, перенаправляясь обратно на веб-сайт, запущенный на моем сервере разработки.Azure ACS, WIF 3.5, Asp.Net 3.5 Пользовательский поставщик членства и IsAuthenticated

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

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

ответ

0

Вам нужно будет сделать четкую разницу между аутентификацией и авторизацией. Поскольку пользователь вошел в систему через 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 (добавьте заявку, если у пользователя есть профиль).

+0

В OnInit() от Global.asax Я добавил: this.PostAcquireRequestState + = (s, e) => SecurityHelper.PostAcquireRequestState(); Затем в SecurityHelper.PostAcquireRequestState У меня есть логика, чтобы проверить, защищена ли страница стандартным FormsAuth, аналогично (http://stackoverflow.com/questions/3390719/determine-if-current-page-requires-authorization) Я также просматриваю через Memberhip.GetUser и проверяю, существует ли учетная запись, иначе я перенаправляюсь на страницу регистрации. – Andre

0

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