OAuth2是一种授权框架,允许第三方应用在用户授权下访问用户资源,而无需暴露用户凭证。在ASP.NET Web API中,当认证失败时,默认会返回401 Unauthorized状态码。
默认的401响应通常只包含简单的状态码和"Unauthorized"消息,可能不足以满足以下需求:
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(HttpActionContext actionContext)
{
actionContext.Response = actionContext.Request.CreateResponse(
HttpStatusCode.Unauthorized,
new
{
Code = "AUTH001",
Message = "Authentication failed",
Details = "Invalid or expired token",
HelpLink = "https://example.com/docs/auth"
});
}
}
如果你使用OWIN中间件进行OAuth2认证:
public class Startup
{
public void Configuration(IAppBuilder app)
{
// 配置OAuth2
var oauthOptions = new OAuthAuthorizationServerOptions
{
Provider = new CustomOAuthProvider(),
AccessTokenExpireTimeSpan = TimeSpan.FromHours(1),
AllowInsecureHttp = true // 仅开发环境使用
};
app.UseOAuthAuthorizationServer(oauthOptions);
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions
{
Provider = new CustomOAuthBearerProvider()
});
}
}
public class CustomOAuthBearerProvider : OAuthBearerAuthenticationProvider
{
public override Task RequestToken(OAuthRequestTokenContext context)
{
return base.RequestToken(context);
}
public override Task ValidateIdentity(OAuthValidateIdentityContext context)
{
if (!context.IsValidated)
{
context.Response.Content = new StringContent(JsonConvert.SerializeObject(new
{
Code = "AUTH002",
Message = "Invalid token",
Details = "The access token is invalid or malformed"
}));
context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
context.Response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
}
return Task.FromResult<object>(null);
}
}
public class CustomUnauthorizedResult : IHttpActionResult
{
private readonly HttpRequestMessage _request;
private readonly string _message;
public CustomUnauthorizedResult(HttpRequestMessage request, string message)
{
_request = request;
_message = message;
}
public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
var response = new HttpResponseMessage(HttpStatusCode.Unauthorized)
{
RequestMessage = _request,
Content = new StringContent(JsonConvert.SerializeObject(new
{
Code = "AUTH003",
Message = _message,
Timestamp = DateTime.UtcNow
}))
};
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
return Task.FromResult(response);
}
}
// 在控制器中使用
[Authorize]
public class ValuesController : ApiController
{
public IHttpActionResult Get()
{
if (!User.Identity.IsAuthenticated)
{
return new CustomUnauthorizedResult(Request, "You must be authenticated to access this resource");
}
return Ok("Authorized content");
}
}
WWW-Authenticate
头以符合HTTP规范通过以上方法,你可以灵活控制ASP.NET Web API在OAuth2认证失败时的响应内容和格式,提供更好的开发者体验和更安全的API服务。
没有搜到相关的文章