如何区分 mvc 5 响应和 web api 2 响应?
How to distinguish a mvc 5 response from an web api 2 response?
我的情况是这样的:
我在同一个项目中使用 mvc5 和 webapi2。我开始使用 mvc,因为我需要身份验证和授权功能,所以我决定使用身份。然后,因为需求的变化,我需要实现一个web服务,所以我决定使用webapi2,但它也必须进行身份验证,所以我选择了基本授权作为我的身份验证方法。为此,我使用了自定义身份验证过滤器。每次出现问题时 ("no credentials", "invalid credentials") 这个过滤器 return 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 状态代码,但我仍然需要 "return to login if secured" 我的应用程序的 mvc 部分中受保护资源的功能。
对不起,我是新手,也很抱歉我的写作。谢谢。
当且仅当您的 web-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
});
我的情况是这样的: 我在同一个项目中使用 mvc5 和 webapi2。我开始使用 mvc,因为我需要身份验证和授权功能,所以我决定使用身份。然后,因为需求的变化,我需要实现一个web服务,所以我决定使用webapi2,但它也必须进行身份验证,所以我选择了基本授权作为我的身份验证方法。为此,我使用了自定义身份验证过滤器。每次出现问题时 ("no credentials", "invalid credentials") 这个过滤器 return 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 状态代码,但我仍然需要 "return to login if secured" 我的应用程序的 mvc 部分中受保护资源的功能。
对不起,我是新手,也很抱歉我的写作。谢谢。
当且仅当您的 web-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
});