Запрос токена OAuth unsupported_grant_type - PullRequest
0 голосов
/ 14 июня 2019

Я работаю над пользовательским 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());
        }
    }
}
...