【问题标题】:AngularJS + ASP.NET Access Control AuthenticationAngularJS + ASP.NET 访问控制认证
【发布时间】:2014-09-09 13:03:03
【问题描述】:

我正在做一个项目,需要客户端的 AngularJS 和服务器端的 ASP.NET Web Api,似乎我对 Angualrjs 还很陌生,我找不到在 AngularJS 中处理访问控制的好方法。 AngularJS 路由似乎只在“应用程序”中“工作”,如果用户直接访问 URL (http://www.test.com/customer?userid=12345),它将无法工作。因此,我正在考虑让 ASP.NET MVC 处理每个 AngularJS 应用程序的路由,并让 AngularJS 路由处理每个应用程序内的路由。

我的问题是,一旦客户端应用程序 (angularjs) 由服务器 (Token) 进行身份验证,如何在我的 ASP.NET MVC 中添加该身份验证?所以我可以使用 User.Identity 之类的东西并从服务器获取所有必要的声明?或者我应该采取其他方式让 ASP.NET MVC 使用 API 进行身份验证调用并将令牌存储在其他地方以便 angularjs 获取它?还是有其他方法可以做到这一点?

【问题讨论】:

    标签: asp.net-mvc angularjs oauth-2.0 asp.net-web-api2 asp.net-identity-2


    【解决方案1】:

    一旦客户端应用程序 (angularjs) 由服务器 (Token) 进行身份验证,我如何在我的 ASP.NET MVC 中添加该身份验证?

    您必须在需要身份验证和授权的操作和/或控制器中插入 [Authorize] 属性。还有其他实现授权过滤器或验证过滤器的可能性,但目前 [Authorize] 属性是一个很好的起点。

    可以使用 User.Identity 之类的东西并获得所有必要的声明 来自服务器?

    是的,当然。从 Db 检索用户后

    IdentityUser user = await repository.FindUser(context.UserName, context.Password);
    

    您将能够获得声明、角色……但这只是一个示例。您将能够从 AngularJS 发送的令牌中获取用户。实际上,为了获取用户声明,为此目的存在 System.Security.Claims 的 ClaimsPrincipal 类。

    但是,没有代码很难回答这个问题,所以我推荐你下面的系列教程。我相信他们会帮助你:

    1. Token Based Authentication
    2. AngularJS Token Authentication
    3. Enable OAuth Refresh tokens

    已编辑

    如果您有 2 个项目,一个用于 ASP.NET MVC,另一个用于 Web API 项目,您必须确保两个 WebConfig 文件具有相同的 machineKey 标签:

    <system.web>
    ...
    <machineKey validationKey="57B449BBA8F9E656087FF7848727E122C5F5966F65AC0FC25FB3532193B59CFCD13B370883FFC184C1F1500638F33E6F67B37CAED1D9BC65BBC6CFFB232BFD0B" decryptionKey="6D9FBE88D16B3FA5B5E6B37460BBE50DA85D5B4C482159006B5A337C58AA9E79" validation="SHA1" decryption="AES" />
    ...
    </system.web>
    

    使用this machine Key Generator。 Token 是根据 machineKey 创建的,所以你必须确保这个字段是相同的。否则,在一个项目上创建的令牌对另一个项目无效。

    【讨论】:

    • 但我正在使用 angularjs 对我的 webapi 进行 /token 调用,你是说 ASP.NET MVC 将获取经过身份验证的对象,即使我使用 angularjs 而不是 asp.net mvc 进行调用?我试过了,但是当我执行 User.Identity 时,我的 Principal 对象总是为空。
    • 我猜你有 2 个不同的项目。一种用于 WepApi,另一种用于 ASP.NET MVC。您必须在两个 webconfig 文件中放置相同的 machineKey。
    • 在相同的 machineKey 上有任何推荐的帖子吗?我假设我应该在 MVC 中进行身份验证调用?像HttpClient?因为如果我直接使用 Angularjs 进行调用,服务器不会知道它对吗?
    • @DesireToKnowMore 我已经编辑了我的答案来告诉你怎么做。
    • 酷!来自的身份验证调用怎么样?客户端?或 $http ?我假设它应该从 HttpClient 调用,因此 MVC 可以通过密钥解密令牌。 Angularjs 将无法访问机器密钥。我说的对吗?
    猜你喜欢
    • 1970-01-01
    • 2014-01-03
    • 2017-09-20
    • 1970-01-01
    • 1970-01-01
    • 2017-10-11
    • 2011-12-06
    • 2017-07-05
    • 1970-01-01
    相关资源
    最近更新 更多