Мобильное приложение Azure и проверка подлинности

У меня есть мобильное приложение, которое я пишу, в настоящее время это просто приложение для быстрого запуска списка элементов с пользовательской аутентификацией. У меня есть связанное приложение Xamarin Forms.

Из приложения я могу войти с помощью метода LoginAsync, мой веб-сайт возвращает маркер и показывает имя пользователя, которое я регистрируюсь как, но последующие вызовы предполагают, что я не авторизован.

После небольшой отладки я вижу, что запрос поступает на веб-сервер с заголовком X-ZUMO-AUTH и токеном в значении, но я вижу, что пользователь не кажется заполненным, и вызов метода GetAllTodoItems возвращается как 401:Unauthorized.

В коде запуска для веб-сайта ConfigureMobileApp содержит следующее:

    app.UseWebApi(config);

    if (string.IsNullOrEmpty(settings.HostName))
    {
        // This middleware is intended to be used locally for debugging. By default, HostName will
        // only have a value when running in an App Service application.
        app.UseAppServiceAuthentication(new AppServiceAuthenticationOptions
        {
            SigningKey = ConfigurationManager.AppSettings["SigningKey"],
            ValidAudiences = new[] { ConfigurationManager.AppSettings["ValidAudience"] },
            ValidIssuers = new[] { ConfigurationManager.AppSettings["ValidIssuer"] },
            TokenHandler = config.GetAppServiceTokenHandler()
        });
    }

У меня есть класс контроллера учетных записей:

[Route(".auth/login/custom")]
public class AccountController : ApiController
{
    private static string URL = "https://myapidev.azurewebsites.net/";
    private static string KEY = "FC31EB8CAAAAAA9D74EEE3613A7A08CA65CB1ACAA8CEFF82A5B5E915625B31D";

    public AccountController()
    {

    }
    [HttpPost]
    public IHttpActionResult Post([FromBody] LoginUser assertion)
    {
        if (isValidAssertion(assertion))
        {
            JwtSecurityToken token = AppServiceLoginHandler.CreateToken(new Claim[] { new Claim(JwtRegisteredClaimNames.Sub, assertion.username) },
                ConfigurationManager.AppSettings["SigningKey"],
                ConfigurationManager.AppSettings["ValidAudience"],
                ConfigurationManager.AppSettings["ValidIssuer"],
                TimeSpan.FromHours(24));

            return Ok(new LoginResult()
            {
                authenticationToken = token.RawData,
                user = new LoginResultUser() { userId = assertion.username }
            });
        }
        else // user assertion was not valid
        {
            return ResponseMessage(Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "Invalid Request"));
        }
    }

    private bool isValidAssertion(LoginUser assertion)
    {
        return assertion != null;
    }
}

TodoItemController содержит следующее:

[Authorize]
[MobileAppController]
public class TodoItemController : TableController<TodoItem>
{
    protected override void Initialize(HttpControllerContext controllerContext)
    {
        base.Initialize(controllerContext);
        EducaterAPIDevContext context = new EducaterAPIDevContext();
        DomainManager = new EntityDomainManager<TodoItem>(context, Request);

        //// Get the SID of the current user.
        //var claimsPrincipal = this.User as ClaimsPrincipal;
        //string sid = claimsPrincipal.FindFirst(ClaimTypes.NameIdentifier).Value;
    }

    // GET tables/TodoItem
    public IQueryable<TodoItem> GetAllTodoItems()
    {
        return Query();
    }
    ...
    ...
}

При вызове метода запроса из приложения Xamarin он возвращает значение 401, даже если X-ZUMO-AUTH находится в заголовках и содержит правильный маркер, выданный методом login.

Я пропустил что — то или кто-то сталкивался с этой проблемой раньше-любая помощь была бы оценена?

2 ответа

  1. Вы включили аутентификацию / авторизацию в Службе приложений? Без него маркер никогда не будет расшифрован.

    Это самый распространенный вопрос.

  2. После копания я нашел проблему, изначально была проблема конфигурации — приведенные выше комментарии помогли спасибо. Аудитории и издатели должны соответствовать сайту azure, включая конечную косую черту.

    Проблема после того, как конфигурация была исправлена, заключалась в том, что маркер, который правильно передается из моего приложения, не обрабатывался на стороне сервера, поэтому все авторизованные области, где вне пределов. Это произошло из-за порядка вызовов в методе ConfigureMobileApp. Я звонил в приложение.Метод UseWebApi перед приложением.UseAppServiceAuthentication метод, изменение порядка внезапно был маркер проверяется снова.

    Фиктивный сайт, на котором я работаю сейчас, имеет следующее:

        public static void ConfigureMobileApp(IAppBuilder app)
        {
            HttpConfiguration config = new HttpConfiguration();
    
            //For more information on Web API tracing, see http://go.microsoft.com/fwlink/?LinkId=620686 
            SystemDiagnosticsTraceWriter traceWriter = config.EnableSystemDiagnosticsTracing();
    
            new MobileAppConfiguration()
                .UseDefaultConfiguration()
                .MapApiControllers()
                .ApplyTo(config);
    
            config.MapHttpAttributeRoutes();
    
            // Use Entity Framework Code First to create database tables based on your DbContext
            //Database.SetInitializer(new EducaterAPIDevInitializer());
    
            // To prevent Entity Framework from modifying your database schema, use a null database initializer
            // Database.SetInitializer<EducaterAPIDevContext>(null);
    
            MobileAppSettingsDictionary settings = config.GetMobileAppSettingsProvider().GetMobileAppSettings();
            if (string.IsNullOrEmpty(settings.HostName))
            {
                var options = new AppServiceAuthenticationOptions
                {
                    SigningKey = ConfigurationManager.AppSettings["SigningKey"],
                    ValidAudiences = new[] { ConfigurationManager.AppSettings["ValidAudience"] },
                    ValidIssuers = new[] { ConfigurationManager.AppSettings["ValidIssuer"] },
                    TokenHandler = config.GetAppServiceTokenHandler()
                };
                app.UseAppServiceAuthentication(options);
            }
            app.UseWebApi(config);
        }