使用 System.Web.Http.ApiController + Postman 进行身份验证 - 没有遇到断点/不确定这是如何工作的

Posted

技术标签:

【中文标题】使用 System.Web.Http.ApiController + Postman 进行身份验证 - 没有遇到断点/不确定这是如何工作的【英文标题】:Authentication with System.Web.Http.ApiController + Postman - Not hitting breakpoints / not sure how this works 【发布时间】:2019-04-23 21:02:38 【问题描述】:

我正在关注this tutorial 在 API 中实现身份验证,并由 Postman 进行测试。

我无法让它工作,部分原因是我不确定我是否理解它应该如何工作。

如果我删除[Authorize] 标记,Get() 方法运行,我进入断点并收到我期望的回复。 但是,如果有 [Authorize],邮递员会回复

"Message":"此请求的授权已被拒绝。"

这也是我所期望的,但是,我没有遇到任何断点,所以我无法弄清楚这个身份验证逻辑发生在哪里

我将身份验证逻辑放在哪里,这意味着我将在哪里查询数据库以查看用户名/密码是否与记录匹配。

这是我正在使用的代码

 public class X: ApiController
 
    private void SetPrincipal(IPrincipal principal)
     // breakpoint
        Thread.CurrentPrincipal = principal;
        if (HttpContext.Current != null)
        
            HttpContext.Current.User = principal;
        
    

    public static void Register(HttpConfiguration config)
     // breakpoint
        config.Filters.Add(new AuthorizeAttribute());
    

    public HttpSessionStateBase Session;

    [Authorize]
    public string Get()
     // breakpoint
      ...
    

【问题讨论】:

authorize 默认情况下表示用户应该经过身份验证,这意味着如果您不提供用户凭据,则根本无法访问该方法 我确实通过邮递员的身份验证选项卡提供了用户名/密码,是否还缺少另一个步骤? 看看这个:docs.microsoft.com/en-us/aspnet/web-api/overview/security/… 【参考方案1】:

感谢提供this example的Elyas Esna

我做了以下更改

在同一个文件中添加了这个

public class CustomAuthorization : AuthorizeAttribute

    public override void OnAuthorization(HttpActionContext actionContext)
    
        AuthenticationHeaderValue authenticationHeaderValue = actionContext.Request.Headers.Authorization;
        var userNamePasswordString = Encoding.UTF8.GetString(Convert.FromBase64String(authenticationHeaderValue.Parameter));
    

更改了Register() 方法

public static void Register(HttpConfiguration config)

    config.Filters.Add(new CustomAuthorization());

以及Get()的属性

[CustomAuthorization]
public string Get()

【讨论】:

以上是关于使用 System.Web.Http.ApiController + Postman 进行身份验证 - 没有遇到断点/不确定这是如何工作的的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)