我导出了 OAuthAuthorizationServerProvider
为了验证客户端和资源所有者。
当我验证资源所有者时,我发现他们的凭据无效,我调用 context.Rejected()
,HTTP 响应随附 HTTP/400 错误请求 状态代码,而我期望 HTTP/401 Unauthorized。
如何自定义 OAuthAuthorizationServerProvider
的响应 HTTP 状态代码?
最佳答案
这就是我们覆盖 OwinMiddleware 的方式...首先我们在 Owin 之上创建了我们自己的中间件...我认为我们遇到了与您类似的问题。
首先需要创建一个常量:
public class Constants
{
public const string OwinChallengeFlag = "X-Challenge";
}
然后我们覆盖 OwinMiddleware
public class AuthenticationMiddleware : OwinMiddleware
{
public AuthenticationMiddleware(OwinMiddleware next) : base(next) { }
public override async Task Invoke(IOwinContext context)
{
await Next.Invoke(context);
if (context.Response.StatusCode == 400 && context.Response.Headers.ContainsKey(Constants.OwinChallengeFlag))
{
var headerValues = context.Response.Headers.GetValues(Constants.OwinChallengeFlag);
context.Response.StatusCode = Convert.ToInt16(headerValues.FirstOrDefault());
context.Response.Headers.Remove(Constants.OwinChallengeFlag);
}
}
}
在 startup.Auth 文件中,我们允许覆盖 Invoke Owin 命令
public void ConfigureAuth(IAppBuilder app)
....
app.Use<AuthenticationMiddleware>(); //Allows override of Invoke OWIN commands
....
}
并且在 ApplicationOAuthProvider 中,我们修改了 GrantResourceOwnerCredentials。
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
using (UserManager<IdentityUser> userManager = _userManagerFactory())
{
IdentityUser user = await userManager.FindAsync(context.UserName, context.Password);
if (user == null)
{
context.SetError("invalid_grant", "The user name or password is incorrect.");
context.Response.Headers.Add(Constants.OwinChallengeFlag, new[] { ((int)HttpStatusCode.Unauthorized).ToString() }); //Little trick to get this to throw 401, refer to AuthenticationMiddleware for more
//return;
}
....
关于c# - 拒绝 token 请求时自定义 OWIN/OAuth HTTP 状态代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30222952/