如何区分mvc 5响应和web api 2响应?

时间:2015-02-20 06:56:51

标签: c# asp.net-mvc authentication asp.net-web-api owin

我的情况是这样的: 我在同一个项目中使用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部分中为我的安全资源“返回登录,如果安全”功能。

对不起,我是新来的,也很抱歉我的写作。谢谢。

1 个答案:

答案 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
});