我有这个解决方案:
我需要在ASP.NET MVC站点和Web Api 2.0上进行一次身份验证(我的意思是我不必检查MVC站点上的用户名和密码是否正确,然后再次在Web Api上检查它们) .
老实说,我认为AngularJS和ASP.NET MVC不是一对好夫妻 . 但是,就是这样! ASP.NET MVC站点和Web Api可以位于不同的服务器上 .
在这一刻我可以在MVC应用程序上进行身份验证,我无法在web api上进行身份验证 . 我正在使用ASP.NET标识的默认代码 . 所以,我的 startup
课程我有:
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
Provider = new CookieAuthenticationProvider
{
// Enables the application to validate the security stamp when the user logs in.
// This is a security feature which is used when you change a password or add an external login to your account.
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(30),
regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
}
});
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
那么,一旦我在asp.net mvc上进行了身份验证,我怎样才能在web api上“自动”进行身份验证?
谢谢
UPDATE
我已经更新了图片 . 在这一刻,我从MVC应用程序做了一些请求 . 但这些请求不需要身份验证 . 其他一些请求来自angularjs,在这里我需要身份验证 . 在这一刻,我在MVC应用程序中验证用户 .
1 回答
如果我有这个权利,那么对你的问题有一个非常简单的解决方案 .
用户在MVC应用程序中进行身份验证,这意味着对MVC控制器和Action方法的任何调用都受到保护,并且已成功通过身份验证 .
在您的MVC应用程序中,您正在向您的WEB API发出请求 .
Web API需要以某种方式保护其资源免受传入请求的影响,并且考虑到只有您的MVC应用程序应负责发出这些请求,您应该在WEB API中实现客户端秘密OAuth流 .
可以将其视为将您的MVC应用程序注册为WEB API的使用者 .
从MVC应用程序到web api的每次调用都会提供您的web api在提供资源之前验证的clientid和secret .
从您的web api的角度来看,它并不关心用户是谁,它只关心试图访问其资源的应用程序 .
如果应用程序无法提供秘密,那么他们就无法访问 .
*** EDIT ***
在您的web-api不面向公众并且仅需要经过身份验证的资源访问的情况下,您的客户端浏览器不应该直接与api通信 .
您可以使用基于令牌的身份验证,其中一旦由令牌 endpoints 进行身份验证,客户端浏览器就会在向您发送的每个请求的标头中传递持有者令牌 .
但是,这意味着您将访问令牌传递给浏览器,我不认为这对安全性有好处 .
这就是为什么我会重新开始客户端浏览器只调用MVC应用程序作为它生活在服务器上,其服务不能被操纵,任何访问令牌都不能被截获 .