C# ОШИБКА токена аутентификации webapi протестирована с PostMan - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь создать токен аутентификации для входа в систему через webapi через C# и протестировал его с PostMan

Вот что я сделал C# webapi Вот мой startup.cs

using Microsoft.Owin;
using Microsoft.Owin.Security.OAuth;
using Owin;
using System;
using System.Web;
using System.Web.Http;
using Microsoft.Owin.Cors;
using DBSecurityTest.Controllers;

[assembly: OwinStartup(typeof(DBSecurityTest.Startup))]

namespace DBSecurityTest
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {

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

            var myProvider = new MyAuthProvider();
            OAuthAuthorizationServerOptions options = new OAuthAuthorizationServerOptions
            {
                AllowInsecureHttp = true,
                TokenEndpointPath = new PathString("/token"),
                AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(30),
                Provider = myProvider
            };
            app.UseOAuthAuthorizationServer(options);
            app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());


            HttpConfiguration config = new HttpConfiguration();
            WebApiConfig.Register(config);
        }
    }
}

MyAuthProvider

using Microsoft.Owin.Security.OAuth;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
using System.Web;
using DBSecurityTest.Models;

namespace DBSecurityTest.Controllers
{
    public class MyAuthProvider : OAuthAuthorizationServerProvider
    {
        public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
        {
            context.Validated();
        }

        public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
        {
            var identity = new ClaimsIdentity(context.Options.AuthenticationType);

            DBSecurityTestEntities DBST = new DBSecurityTestEntities();
            var userdata = DBST.EF_UserLogin(context.UserName, context.Password).FirstOrDefault();
            if (userdata != null)
            {
                identity.AddClaim(new Claim(ClaimTypes.Role, userdata.UserRole));
                identity.AddClaim(new Claim(ClaimTypes.Name, userdata.UserName));
                context.Validated(identity);
            }
            else
            {
                context.SetError("invalid_grant", "Provided username and password is incorrect");
                context.Rejected();
            }
        }
    }
}

WebApiConfig

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
using Microsoft.Owin.Cors;
using System.Web.Http.Cors;

namespace DBSecurityTest
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            EnableCorsAttribute cors = new EnableCorsAttribute("*", "*", "*");
            config.EnableCors();
            // Web API configuration and services

            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",


        defaults: new { id = RouteParameter.Optional }
            );


        }
    }
}

Я уже создал базу данных запрос следующим образом:

use [DBSecurityTest]

CREATE TABLE [dbo].[UserLogin](  
    [Id] [int] IDENTITY(1,1) NOT NULL,  
    [UserName] [varchar](50) NULL,  
    [UserPassword] [varchar](50) NULL,  
    [UserEmail] [varchar](50) NULL,  
    [UserRole] [varchar](50) NULL,  
 CONSTRAINT [PK_UserLogin] PRIMARY KEY CLUSTERED   
(  
    [Id] ASC  
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]  
) ON [PRIMARY]  

GO  



-- insert data in table  
insert into UserLogin(UserName,UserPassword,UserEmail,UserRole)  
values ('admin','123456','admin@gmail.com','admin')  

-- create store procedure   
Create PROCEDURE [dbo].[EF_UserLogin]   
    @UserName varchar(50)=null,  
    @UserPassword varchar(50)=null  
AS  
BEGIN  

    SET NOCOUNT ON;  

    SELECT  UserName,UserPassword,UserEmail,UserRole from UserLogin where UserName=@UserName and UserPassword=@UserPassword  
END

Я уже добавил ADO. Net Модель

Итак, теперь я сталкиваюсь с тем, что я запускаю API и проверил токен, используя мой почтальон . Пошла ошибка. Моя конфигурация почтальона выглядит следующим образом:

POST, / токен, который я выбираю Body и x.www-form-urlencoded

Ошибка приходит с {"error": "unsupported_grant_type"}

Это ошибка конфигурации моего почтальона или что-то, связанное с моим C# кодом API?

Ответы [ 2 ]

0 голосов
/ 27 марта 2020

Вы написали контроллер для этого? Я думаю, что вы пропустили контроллер для хранения параметров и обработки. То, как вы заявляете, кажется, что в бэкэнде C# WebApi нет обработки.

Я думаю, что вы можете сослаться на некоторые видео отсюда: https://www.youtube.com/watch?v=BZnmhyZzKgs

Спасибо.

0 голосов
/ 10 марта 2020

Речь идет о вашем запросе. Когда вы отправляете запрос с помощью Postman, вы должны передать параметр с именем grant_type.

Платформа OAuth определяет несколько типов предоставления для разных вариантов использования, так как а также каркас для создания новых типов грантов.

Ниже перечислены наиболее распространенные типы грантов OAuth.

  • Код авторизации
  • Учетные данные клиента
  • Код устройства
  • Refre sh Токен

для получения дополнительной информации читайте Типы OAuth-грантов пожалуйста.

...