我的情况是这样的: 我在同一个项目中使用mvc5和webapi2。我开始使用mvc,因为我需要身份验证和授权功能,所以我决定使用身份。然后,由于需求的变化,我需要实现一个Web服务,所以我决定使用webapi2,但它也必须进行身份验证,所以我选择了基本授权作为我的身份验证方法。为此,我使用了自定义身份验证过滤器。每次出现问题(“无凭证”,“无效凭证”)时,此过滤器都会通过上下文结果属性返回unauthorizedResult结果:
context.Result = new UnauthorizedResult(new AuthenticationHeaderValue[] { new AuthenticationHeaderValue("Basic") }, context.Request);
这实际上通过响应发送了401状态代码(我使用调试器检查了它)。问题是在我的客户端我收到了200状态代码。我认为这是因为我收到了登录页面的结果,所有这些都是因为我在开始配置我的mvc应用程序时设置的代码块:
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Cuenta/Login"),
});
不知何故,在某些上下文管道中,我的未经授权的webapi响应被捕获并被视为来自mvc控制器的响应。那么请,我怎么避免这个?当我的Web服务尝试获取安全资源时,我需要收到401状态代码,但我仍然需要在我的应用程序的mvc部分中为我的安全资源“返回登录,如果安全”功能。
对不起,我是新来的,也很抱歉我的写作。谢谢。
答案 0 :(得分:0)
当且仅当您的网络API路由而非您的MVC包含/api/
时,您可以通过创建这样的自定义CookieAuthenticationOptions.Provider.OnApplyRedirect
来解决此问题:
var urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext);
var provider = new CookieAuthenticationProvider();
var originalHandler = provider.OnApplyRedirect;
provider.OnApplyRedirect = context =>
{
if (!HttpContext.Current.Request.Url.AbsoluteUri.Contains("/api/"))
{
var routeValues = new RouteValueDictionary();
var uri = new Uri(context.RedirectUri);
var returnUrl = HttpUtility.ParseQueryString(uri.Query)[context.Options.ReturnUrlParameter];
routeValues.Add(context.Options.ReturnUrlParameter, returnUrl);
per.Action("login", "account", routeValues);
context.RedirectUri = newUri;
originalHandler.Invoke(context);
}
};
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString(urlHelper.Action("Login", "Account")),
Provider = provider
});