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 (не смешивайте их) и первый оператор в вашем запуске.