ASP.NET WEB API 2 OWIN Authentification unsuported grant_Type
Salut, je suis en train de mettre en place le protocole OAuth bearrer jeton d'authentification dans mon ASP.NET Web API 2 du projet.
J'ai deux projet sera l'API WEB du Projet et de l'autre un projet de SPA.
Voici ce que j'ai fait jusqu'à présent:
J'ai créé la OWIN Démarrage de classe:
[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);
}
}
J'ai configuré le Web API pour utiliser seulement le porteur du jeton d'authentification:
private static void ConfigureBearerTokenAuthentication(HttpConfiguration config)
{
config.SuppressDefaultHostAuthentication();
config.Filters.Add(new HostAuthenticationFilter(Startup.OAuthOptions.AuthenticationType));
}
J'ai configuré l'API WEB pour le soutien de la SCRO:
private static void ConfigureCrossOriginResourseSharing(HttpConfiguration config)
{
var cors = new EnableCorsAttribute("*", "*", "*");
config.EnableCors(cors);
}
J'ai créé la OAuthAuthorizationServerProvider classe.À partir de cette classe j'ai seulement réussi à faire mon code à l'appel de cette méthode:
public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
{
if(context.ClientId == null)
{
context.Validated();
}
return Task.FromResult<object>(null);
}
La condition si à l'intérieur d'elle obtient toujours exécuté.
Sur mon projet de spa j'ai le texte suivant:
C'est mon viewModel:
var vm = {
grant_type: "password",
userName: ko.observable(),
password: ko.observable()
};
Lorsque la connexion bouton cliqué j'appelle cette fonction:
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);
});
}
Ma première tentative, j'ai mis le post des appels de type de données json et j'ai eu cette erreur:
OPTIONS ...:3439/Jeton 400 (Bad Request) de jquery.js:7845
OPTIONS ...:3439/Jeton Non "Access-Control-Allow-Origin'
l'en-tête est présent sur la ressource demandée. Origine
'...:3304' est donc pas autorisé à accéder.
jquery.js:7845XMLHttpRequest ne peut pas charger ...3439/Jeton. Pas de
"Access-Control-Allow-Origin' en-tête est présent sur le demandé
de la ressource. Origine "...3304' est donc pas permis
d'accès.
Les 3 points représentent http://localhost
.
La deuxième fois arround j'ai mis ce type de données pour jsonp, et j'ai retrouvé une erreur qui a déclaré non pris en charge "unsupported_grant_type".
Deux appels se rendre à ValidateClientAuthentication que je l'ai mentionné ci-dessus, mais ils sont tous deux envoyés à l'arrière comme un échec de la demande.
Maintenant, je suppose que le problème est plus lié à la façon dont je suis l'envoi de données au lieu de la grand_type parce que le SPA modèle dans Visual Studion de l'ensemble de la subvention type de grant_type: "mot de passe" comme je l'ai fait.
Aussi j'ai lu que j'ai pour sérialiser les données de ne pas l'envoyer en json dans l'ordre pour que cela fonctionne ici est exactement le json de données sérialisées qui est envoyé:
"grant_type=password&userName=aleczandru&password=happynewYear&moduleId=models%2FappPostModels%2FloginModel"
L'id du modèle de la propriété est définie pour tout mon objet dans mon SPA modèle par Durandal Cadre.
Quelqu'un peut me dire ce que je fais de mal, j'ai essayé de comprendre cela pour les deux derniers jours?
Vous devez vous connecter pour publier un commentaire.
Ajouter la ligne de code suivante à
GrantResourceOwnerCredentials
, qui va ajouter l'en-tête de la réponse.pour plus d'informations, reportez-vous à:
web-api-2-0-la scro-et-personne-compte-identité
Comme Robin Karlsson dit, vous devez utiliser:
dans votre configuration de Démarrage.
Et assurez-vous que c'est la seule déclaration de la scro (ne pas les mélanger) et la première instruction de Démarrage.