【问题标题】:C# webapi authentication token ERROR tested with PostMan使用 PostMan 测试的 C# webapi 身份验证令牌错误
【发布时间】:2020-06-04 09:14:59
【问题描述】:

我正在尝试通过 C# 使用 webapi 创建登录身份验证令牌并使用 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 时无法通过 Postman 测试我的令牌。

我的邮递员配置如下:

POST, /token 我选择Bodyx.www-form-urlencoded

错误伴随着 {"error":"unsupported_grant_type"}

是我的 Postman 配置错误还是我的 C# api 代码有问题?

【问题讨论】:

    标签: c# api authentication postman


    【解决方案1】:

    您是否为此编写了控制器? 我认为您错过了一个控制器,用于存储和处理参数。您声明的方式似乎在 C# WebApi 后端没有处理。

    我想你可以参考这里的一些视频: https://www.youtube.com/watch?v=BZnmhyZzKgs

    谢谢。

    【讨论】:

    • 嗨@user13074015,我用你的视频工作,它成功了!让我开始关注 API 并完成代码。谢谢!!!
    【解决方案2】:

    这是关于您的请求,当您使用 Postman 发送请求时,您应该传递一个名为 grant_type 的参数。

    OAuth 框架为不同的用例指定了几种授权类型,以及用于创建新授权类型的框架。

    下面列出了最常见的 OAuth 授权类型。

    • 授权码
    • 客户端凭据
    • 设备代码
    • 刷新令牌

    更多信息请阅读OAuth Grant Types

    【讨论】:

      猜你喜欢
      • 2021-09-23
      • 2021-06-19
      • 2019-05-18
      • 2022-06-20
      • 2018-08-03
      • 2020-04-23
      • 1970-01-01
      • 2011-12-01
      相关资源
      最近更新 更多