我想為控制器添加承載身份驗證,但它沒有運行動作過濾器中的代碼。我試圖添加Debug.WriteLine(...);,但它沒有在輸出中顯示任何內容。
拿來:
fetch('api/Test/Select', {
headers: {
'Content-type': 'application/json',
'Authorization': `Bearer ${sessionStorage.getItem("token")}`,
},
method: 'GET',
})
和 MVC 控制器:
using System;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.AspNetCore.Hosting;
namespace API
{
[BearerAuthentication] //<-- Action Filter
[Route("api/Test")]
public class TestController : ControllerBase
{
//...
[HttpGet("Select")]
public IActionResult Select()
{
try
{
return Ok(FirstService.Select());
}
catch (Exception ex)
{
return Conflict(ex);
}
}
//...
動作過濾器:
public class BearerAuthenticationAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext context)
{
Debug.WriteLine("Why are u not working?"); //<-- Debug Console shows nothing
HttpRequestMessage request = context.Request;
AuthenticationHeaderValue authorization = request.Headers.Authorization;
//...
}
}
uj5u.com熱心網友回復:
您的BearerAuthenticationAttribute類擴展ActionFilterAttribute類但未實作IActionFilter介面的問題。您的類必須顯式地實作IActionFilter介面OnActionExecuting才能觸發該方法。
以下是Microsoft Hands On Lab的實施示例:
public class CustomActionFilter : ActionFilterAttribute, IActionFilter
{
void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
{
// TODO: Add your action filter's tasks here
// Log Action Filter call
using (MusicStoreEntities storeDb = new MusicStoreEntities())
{
ActionLog log = new ActionLog()
{
Controller = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName,
Action = string.Concat(filterContext.ActionDescriptor.ActionName, " (Logged By: Custom Action Filter)"),
IP = filterContext.HttpContext.Request.UserHostAddress,
DateTime = filterContext.HttpContext.Timestamp
};
storeDb.ActionLogs.Add(log);
storeDb.SaveChanges();
OnActionExecuting(filterContext);
}
}
}
uj5u.com熱心網友回復:
如果您的身份驗證方法是不記名,那么您可以這樣做[Authorize]并且不要忘記使用[ApiController],因此 .net 知道它需要驗證每個端點設定:
using System;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Authorization;
namespace API
{
[ApiController]
[Authorize]
[Route("api/Test")]
public class TestController : ControllerBase
{
//...
[HttpGet("Select")]
public IActionResult Select()
{
try
{
return Ok(FirstService.Select());
}
catch (Exception ex)
{
return Conflict(ex);
}
}
//...
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/420342.html
標籤:
下一篇:一圖搞懂掃碼登錄的技術原理
