MVC站点中的Web Api-在管道中实现MessageHandler

本文关键字:管道 实现 MessageHandler Web 站点 MVC Api- | 更新日期: 2023-09-27 18:07:29

几周前,我决定开始为我的系统构建一个由MVC门户领导的API。我在我现有的MVC站点中添加了WebApi功能:

class WebApiConfig
{
    public static void Register(HttpConfiguration configuration)
    {
        configuration.Routes.MapHttpRoute("API Default", "api/{controller}/{id}",
            new { id = RouteParameter.Optional });
    }
}

在我的app_start文件夹中,并通过添加修改我的Global.asax

GlobalConfiguration.Configure(WebApiConfig.Register);

无论是在没有[Authorize]标记的情况下,还是在浏览器中通过首先登录来调用Values控制器中的简单方法,它都非常有效,但从那以后,我一直在阅读关于在asp.net web api中实现基本身份验证的文章,我发现了一些我试图在实现中使用的示例。

我已经实现了一个在网上找到的消息处理程序的代码示例,用于授权对它的请求,在这个阶段,只需将ApiKey头字符串与本地存储在处理程序类中的头字符串进行比较,就可以测试它的工作情况。

处理程序如下所示:

protected override Task<HttpResponseMessage> SendAsync(
       HttpRequestMessage request, CancellationToken cancellationToken)
    {
        IEnumerable<string> apiKeyHeaderValues = null;
        if (request.Headers.TryGetValues("ApiKey", out apiKeyHeaderValues))
        {
            var apiKeyHeaderValue = apiKeyHeaderValues.First();
            // ... your authentication logic here ...
            var username = (apiKeyHeaderValue == "12345" ? "Authorised" : "OtherUser");
            var usernameClaim = new Claim(ClaimTypes.Name, username);
            var identity = new ClaimsIdentity(new[] { usernameClaim }, "ApiKey");
            var principal = new ClaimsPrincipal(identity);
            Thread.CurrentPrincipal = principal;
        }
        return base.SendAsync(request, cancellationToken);
    }

然后我把它添加到我的global.asax:

GlobalConfiguration.Configuration.MessageHandlers.Add(new ApiAuthHandler());

现在,我从这里获得了完整的代码:https://dzone.com/articles/api-key-user-aspnet-web-api因为我是新手,很多授权的实施对我的需求来说太复杂/对我来说太复杂,无法开始学习。

我确实理解它的流程,从收到请求时对其进行调试开始,它正确地进行了ApiKey比较并创建了原理。然而,答案并不正确。。。并且它从未到达请求的api方法。我得到的回复是:

重定向收件人:http://localhost:2242/Account/Login?ReturnUrl=%2Fapi%2Fvalues状态为:302显示解释HTTP/1.1 302找到

它将我重定向到我的register方法,正如[Authorize]标记所指的那样,它实际上是完整地返回我的Register.cshtml。我不知道如何忽略这一点并让ApiAuthHandler为我授权。我假设我需要在MVC管道的某个地方更改一些东西,但我不确定是什么。

只想做一些非常简单的工作,这样我就可以更多地了解它,探索更复杂的API身份验证。你知道我做错了什么吗?

编辑添加了api控制器:

public class ValuesController : ApiController
{
    ApplicationDbContext context = new ApplicationDbContext();
    InboundDBContext inboundContext = new InboundDBContext();
    // GET api/<controller>
    [Authorize]
    public string Get()
    {
        return user.Identity.Name;
    }
    // GET api/<controller>/5
    public string Get(int id)
    {

        return "value";
    }

MVC站点中的Web Api-在管道中实现MessageHandler

WebApiConfig.cs文件应该是这样的。。。

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
        //add the authorization handler to the pipeline
        config.MessageHandlers.Add(new new ApiAuthHandler()());
    }
}