ASP.NET Web API 2 OWIN аутентификация неподтвержденный тип гранта

Привет я пытаюсь настроить аутентификацию токена OAuth bearrer в моем ASP.NET проект Web API 2. У меня есть два проекта: Один будет проектом WEB API, а другой-проектом SPA.

вот что я сделал до сих пор:

Я создал класс запуска OWIN:

[assembly: OwinStartup(typeof(CodeArt.WebApi.App_Start.Startup))]

namespace CodeArt.WebApi.App_Start

{
    public class Startup
    {
        static Startup()
        {
            PublicClientId = "self";

        UserManagerFactory = () => new UserManager<UserModel>(new UserStore<UserModel>());

        OAuthOptions = new OAuthAuthorizationServerOptions {
            TokenEndpointPath = new PathString("/Token"),
            Provider = new OAuthAuthorizatonServer(PublicClientId, UserManagerFactory),
            AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
            AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
            AllowInsecureHttp = true
        };
    }

    public static OAuthAuthorizationServerOptions OAuthOptions { get; private set; }

    public static Func<UserManager<UserModel>> UserManagerFactory { get; set; }

    public static string PublicClientId { get; private set; }
    public void Configuration(IAppBuilder app)
    {
        ConfigureAuth(app);
    }

    public void ConfigureAuth(IAppBuilder app)
    {
        app.UseCookieAuthentication(new CookieAuthenticationOptions());
        app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalBearer);
        app.UseOAuthBearerTokens(OAuthOptions);
    }
}

Я настроил веб-API для использования только аутентификации токена носителя:

    private static void ConfigureBearerTokenAuthentication(HttpConfiguration config)
    {
        config.SuppressDefaultHostAuthentication();
        config.Filters.Add(new HostAuthenticationFilter(Startup.OAuthOptions.AuthenticationType));

    }

Я настроил веб-API для поддержки CORS:

    private static void ConfigureCrossOriginResourseSharing(HttpConfiguration config)
    {
        var cors = new EnableCorsAttribute("*", "*", "*");
        config.EnableCors(cors);
    }

Я создал класс OAuthAuthorizationServerProvider.Из этого класса мне удалось только сделать мой код вызов этого метода:

   public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
    {
        if(context.ClientId == null)
        {
            context.Validated();
        }

        return Task.FromResult<object>(null);
    }

условие if внутри него всегда выполняется.

на моем спа-проекте у меня есть следующее:

это моя viewModel:

 var vm = {
        grant_type: "password",
        userName: ko.observable(),
        password: ko.observable()
};

при нажатии кнопки входа в систему я вызываю эту функцию:

     var http = {
          post:function(url, data) {
             return $.ajax({
                url: url,
                data: data,
                type: 'POST',
                contentType: 'application/json',
                dataType: 'jsonp'
            });
        }
     }

function loginClick() {
        var model = ko.mapping.toJS(vm.loginModel);
        var rez = $.param(model);

        http.post("http://localhost:3439/Token", rez)
            .done(function (data) {
                console.log(data);
            })
            .fail(function(eror, stuff, otherstuff) {
                console.log(eror);
                console.log(stuff);
                console.log(otherstuff);
            });
    }

моя первая попытка я установил тип данных post calls в json, и я получил эти ошибки:

параметры ...: 3439 / Token 400 (плохой запрос) jquery.js: 7845

параметры ...: 3439 / Маркер No 'Access-Control-Allow-Origin' заголовок присутствует на запрашиваемый ресурс. Происхождение '...:3304 ' поэтому не допускается доступ. на jQuery.js: 7845

XMLHttpRequest не удается загрузить ...3439/маркер. Нет Заголовок "Access-Control-Allow-Origin" присутствует на запрошенном ресурс. Происхождение.' ..3304 ' поэтому не допускается доступ.

3 точки represent http://localhost.

во второй раз я установил его тип данных в jsonp, и я получил ошибку, которая заявила неподдерживаемый "unsupported_grant_type".

оба вызова делают его ValidateClientAuthentication, о котором я упоминал выше, но они оба отправляются обратно как неудачный запрос.

теперь я предполагаю, что проблема больше связана с тем, как я отправляю данные вместо grand_type, потому что шаблон SPA В наборе Visual Studion-это тип гранта grant_type:" пароль", как и я.

также я прочитал, что мне нужно сериализовать данные, которые не отправляют его в json, чтобы это работало, вот точные сериализованные данные json, которые отправляются: "grant_type=пароль & имя пользователя=aleczandru & пароль=happynewYear&атрибут moduleid=модели%2FappPostModels%2FloginModel"

свойство id модели get установлено на все мои объекты в моем шаблоне SPA с помощью Durandal Framework.

может кто-нибудь сказать мне, что я делаю неправильно я пытался понять это в течение последних двух дней?

2 ответов


добавьте следующую строку кода GrantResourceOwnerCredentials, который добавит заголовок к ответу.

context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });

для получения дополнительной информации обратитесь к: web-api-2-0-cors-and-individual-account-identity


Как сказал Робин Карлссон, вы должны использовать:

app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);

в конфигурации автозагрузки.

и убедитесь, что это единственный оператор cors (не смешивайте их) и первый оператор в вашем запуске.