Web API控制器和MVC控制器-身份验证

3
我有一个MVC应用程序,它还使用Web API控制器提供的服务。
MVC和Web API的托管环境都是IIS。在IIS身份验证模式设置为匿名。
HttpModule用于将用户的身份和角色设置到线程和HttpContext对象中。
所有这些操作都能够正确调用MVC控制器,但是Web API控制器却返回401未授权错误。
两个控制器都使用了适当的授权属性。
下面是用于将用户设置为线程和上下文对象的代码。
var principal = new GenericPrincipal(new GenericIdentity(userName), roles);
                // contextBase.User = principal;
                HttpContext.Current.User = principal;
                Thread.CurrentPrincipal = principal;
1个回答

5

Web Api是基于REST的。除其他外,REST是无状态的,意味着没有会话的概念。MVC中的身份验证通过会话处理,因此仅在应用程序的MVC侧进行身份验证对Web Api侧不起任何作用。

每个Web Api请求必须具有完成该请求所需的所有信息,包括任何适用的身份验证/授权。通常,使用API时,这是通过在请求标头中传递身份验证令牌来处理的,但是您可以使用许多方法来授权API请求。我建议只是搜索类似“web api authentication”的内容并阅读一些文章。

长话短说,授权Web Api端点需要与在MVC站点进行身份验证的过程不同且分离的过程。


你是说我需要为 WEB API 控制器使用不同的身份验证机制吗? - Sam
不正确。在ASP.NET中,“sessions”与“authentication”是分开的,因此您可以启用其中一个而不启用另一个,但它们都是基于会话的,从一般意义上讲(这就是我的意思)。即使如此,并非所有的MVC身份验证都是基于表单身份验证的。MVC 5默认使用Identity,它完全独立且平行于表单身份验证。是否涉及cookie也是一个单独的概念,并且可以单独配置(尽管无cookie会话/身份验证在此时已被弃用)。 - Chris Pratt
@Sam:是的,这正是我想说的。它们都可以引用相同的用户持久性存储,并且甚至可以使用相同的基础设施(在最新的公共版本中为Identity),但是通过MVC站点进行身份验证对您在Web Api中的已认证状态没有任何影响,反之亦然。它们使用完全不同的方法来确定请求是否“已授权”。 - Chris Pratt
谢谢,我还发现了一些文章,解释了我们可以使用HttpModule来验证/授权WebAPI。这些模块也可以用于MVC控制器。有没有办法可以同时为两者使用相同的HttpModule,因为我的应用程序使用IIS作为托管环境? - Sam
1
再说一遍,这是REST API与传统网站工作方式的区别。使用REST端点时,身份验证令牌或其他必须在每个请求中传递,因为每个请求都是独立的,不受之前或之后发生的任何事情的影响。而在传统网站中,会话被用来在请求之间保持身份验证状态。没有一个解决方案可以同时适用于两者。 - Chris Pratt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接