Я работаю над пользовательским API, который будет доставлять информацию из базы данных SQL Server. Я использовал OAuth для авторизации (не завершено, сейчас он всегда должен выдавать токен, даже если вы не авторизованы). Но когда я пытаюсь запросить свой токен, я всегда получаю сообщение об ошибке unsupported_grant_type. Я понятия не имею, почему, может кто-нибудь помочь мне, пожалуйста: / Кстати, я использую Почтальон с GET-URI http://localhost:60998/Token
Вот мой код OAuth:
using Microsoft.Owin.Security.OAuth;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Web;
using Microsoft.Owin.Security.Cookies;
using Microsoft.Owin.Security;
using Microsoft.Owin.Security.OAuth;
using System.Threading.Tasks;
namespace ApiStad.Helpers
{
public class AppOAuthProvider : OAuthAuthorizationServerProvider
{
private readonly String _PublicClientID;
public AppOAuthProvider(String publicClientID)
{
_PublicClientID = publicClientID;
}
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
var claims = new List<Claim>();
claims.Add(new Claim(ClaimTypes.Name, context.UserName));
ClaimsIdentity oAuthClaimIdentity = new ClaimsIdentity(claims, OAuthDefaults.AuthenticationType);
ClaimsIdentity cookiesClaimIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationType);
AuthenticationProperties properties = CreateProperties(context.UserName);
AuthenticationTicket ticket = new AuthenticationTicket(oAuthClaimIdentity, properties);
context.Validated(ticket);
context.Request.Context.Authentication.SignIn(cookiesClaimIdentity);
}
public static AuthenticationProperties CreateProperties(String UserName)
{
IDictionary<string, string> data = new Dictionary<string, string>
{
{
"UserName", UserName
}
};
return new AuthenticationProperties(data);
}
public override Task TokenEndpoint(OAuthTokenEndpointContext context)
{
foreach(KeyValuePair<string, string> property in context.Properties.Dictionary)
{
context.AdditionalResponseParameters.Add(property.Key, property.Value);
}
return Task.FromResult<object>(null);
}
public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
{
if(context.ClientId == null)
{
context.Validated();
}
return Task.FromResult<object>(null);
}
public override Task ValidateClientRedirectUri(OAuthValidateClientRedirectUriContext context)
{
if(context.ClientId == _PublicClientID)
{
Uri expectedRootUri = new Uri(context.Request.Uri, "/");
if(expectedRootUri.AbsoluteUri == context.RedirectUri)
{
context.Validated();
}
}
return Task.FromResult<object>(null);
}
}
}
А вот мой WebApiConfig:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
using Microsoft.AspNet.OData.Builder;
using Microsoft.AspNet.OData.Extensions;
//using System.Web.Http.OData.Builder;
//using System.Web.Http.OData.Extensions;
using System.Data.Entity;
using ApiStad.Models;
using Microsoft.Owin.Security.OAuth;
namespace ApiStad
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.SuppressDefaultHostAuthentication();
config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
config.Count().Filter().OrderBy().Expand().Select().MaxTop(null);
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<benutzer>("Benutzer");
builder.EntitySet<fortschritt>("Fortschritt");
config.MapODataServiceRoute("odata", "odata", builder.GetEdmModel());
}
}
}