2016-10-26 3 views
0

Я работаю над мобильным приложением Xamarin Forms с бэкендом .NET. Я последовал this guide и успешно настроить пользовательские аутентификации с одним изменением в Startup.cs:Azure для мобильных приложений Пользовательская + аутентификация Facebook с Xamarin.Forms

app.UseAppServiceAuthentication(new AppServiceAuthenticationOptions 
     { 
      SigningKey = Environment.GetEnvironmentVariable("WEBSITE_AUTH_SIGNING_KEY"), 
      ValidAudiences = new[] { Identifiers.Environment.ApiUrl }, 
      ValidIssuers = new[] { Identifiers.Environment.ApiUrl }, 
      TokenHandler = config.GetAppServiceTokenHandler() 
     }); 

без "если (string.IsNullOrEmpty (settings.HostName))". В противном случае я всегда получаю несанкционированный доступ ко всем запросам после входа в систему.

проект Сервера:

  1. Auth контроллер

    класса ClubrAuthController общественности: ApiController { частных чтений ClubrContext DbContext; приватный readonly ILoggerService loggerService;

    public ClubrAuthController(ILoggerService loggerService) 
    { 
        this.loggerService = loggerService; 
        dbContext = new ClubrContext(); 
    } 
    
    public async Task<IHttpActionResult> Post(LoginRequest loginRequest) 
    { 
        var user = await dbContext.Users.FirstOrDefaultAsync(x => x.Email == loginRequest.username); 
        if (user == null) 
        { 
         user = await CreateUser(loginRequest); 
        } 
    
        var token = GetAuthenticationTokenForUser(user.Email); 
    
        return Ok(new 
        { 
         authenticationToken = token.RawData, 
         user = new { userId = loginRequest.username } 
        }); 
    } 
    
    private JwtSecurityToken GetAuthenticationTokenForUser(string userEmail) 
    { 
        var claims = new[] 
        { 
         new Claim(JwtRegisteredClaimNames.Sub, userEmail) 
        }; 
    
        var secretKey = Environment.GetEnvironmentVariable("WEBSITE_AUTH_SIGNING_KEY"); 
        var audience = Identifiers.Environment.ApiUrl; 
        var issuer = Identifiers.Environment.ApiUrl; 
    
        var token = AppServiceLoginHandler.CreateToken(
         claims, 
         secretKey, 
         audience, 
         issuer, 
         TimeSpan.FromHours(24) 
         ); 
    
        return token; 
    } 
    

    }

  2. Startup.cs проект

    ConfigureMobileAppAuth(app, config, container); 
        app.UseWebApi(config); 
    } 
    
    private void ConfigureMobileAppAuth(IAppBuilder app, HttpConfiguration config, IContainer container) 
    { 
        config.Routes.MapHttpRoute("ClubrAuth", ".auth/login/ClubrAuth", new { controller = "ClubrAuth" }); 
    
        app.UseAppServiceAuthentication(new AppServiceAuthenticationOptions 
        { 
         SigningKey = Environment.GetEnvironmentVariable("WEBSITE_AUTH_SIGNING_KEY"), 
         ValidAudiences = new[] { Identifiers.Environment.ApiUrl }, 
         ValidIssuers = new[] { Identifiers.Environment.ApiUrl }, 
         TokenHandler = config.GetAppServiceTokenHandler() 
        }); 
    } 
    

Клиента:

MobileServiceUser user = await MobileClient.LoginAsync(loginProvider, jtoken); 

Кроме того, я настроен провайдер Facebook в лазурном портале, как описано here. Но он работает только тогда, когда я комментирую app.UseAppServiceAuthentication (новый AppServiceAuthenticationOptions() {...}); в Startup.cs. Что мне не хватает, чтобы оба типа аутентификации работали одновременно?

ответ

-1

Код, на который вы ссылаетесь, предназначен только для локальных развертываний. Для развертывания Azure вам необходимо включить аутентификацию/авторизацию службы приложений - даже если вы не настроите провайдера auth (чего вы бы не сделали в случае пользовательского auth).

Заканчивать Глава 2 моей книги - http://aka.ms/zumobook

+0

Я включил аутентификацию/авторизацию приложения, но получаю неаронизированный ответ без app.UseAppServiceAuthentication (новый AppServiceAuthenticationOptions() {...}); в Startup.cs. Можно ли настроить аутентификацию Custom + Facebook с помощью Xamarin.Forms? Может ли кто-нибудь предоставить рабочий образец? –

+0

Это возможно. То, что Адриан указывает на то, что app.UseAppServiceAuthentication() не связано с пользовательской частью аутентификации, и я думаю, что здесь вводится проблема. Объясню больше в моем собственном ответе, чтобы не ударить по персонажам :) – mattchenderson

0

Поскольку вы включили App служба аутентификации/авторизации, который будет уже проверить маркер. Он предполагает информацию о вашей структуре токенов, например, о том, что аудитория и эмитент совпадают с вашим URL-адресом приложения (по умолчанию).

app.UseAppServiceAuthentication() также подтвердит токен, так как это meant for local development. Поэтому в вашем примере токен будет проверяться дважды. Помимо потенциального воздействия на производительность, это, как правило, хорошо. Однако это означает, что токены должны пройти проверку на обоих уровнях, и я подозреваю, что это не так, следовательно, ошибка.

Один из способов проверить это - проверить сами токены. Установите контрольную точку в своем клиентском приложении и возьмите маркер, который вы получите от LoginAsync(), который будет частью этого пользовательского объекта. Затем перейдите к службе, например http://jwt.io, чтобы посмотреть, как выглядит содержимое токена. Я подозреваю, что токен Facebook будет иметь другие aud и iss претензии, чем Identifiers.Environment.ApiUrl, которые вы настраиваете для app.UseAppServiceAuthentication(), в то время как пользовательский токен, вероятно, будет соответствовать ему, так как вы используете это значение в своем первом фрагменте кода.

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

Простейшим решением здесь является удаление app.UseAppServiceAuthentication() при размещении в облаке. Вам также необходимо убедиться, что ваш звонок до CreateToken() использует URL-адрес облака как аудиторию и эмитента.


Для других людей, которые находят этот вопрос

  • Документация для пользовательской аутентификации можно найти here.
  • Общий обзор аутентификации/авторизации службы приложений можно найти here.
Смежные вопросы