使用AngularJS,WebAPI 2和Oauth 2时,如何将授权信息发送回我的客户端应用程序?

萨曼莎JT星

我有一个AngularJS客户端应用程序,它使用javascriptOauth2(而不是coffeescript或typescript)对Oauth2进行身份验证,而该WebAPI 2应用程序使用的是最新的Identity 2我的应用程序中的所有软件都是最新的,并且基于this example我的客户端浏览器目标是IE9及更高版本。

请注意,与上面的示例相比,我做了一些细微的更改,因为我没有对使用转换发送给服务器的所有数据进行urlencode。相反,我仅在下面的authenticate方法中urlencode:

user.authenticate = function (userName, password, rememberMe, successCallback, errorCallback) {
    var config = {
        method: 'POST',
        url: '/Token',
        headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
        data: 'grant_type=password&username=' + encodeURIComponent(userName) + '&password=' + encodeURIComponent(password),
    };

我正在使用VS2013 Update 2开发,并且在服务器上,我使用C#,最新的Entity Framework和SQL Server 2012。

要登录,我的客户端将调用/ Token方法到WebAPI并传递用户ID和密码。然后,WebAPI用令牌响应我存储的客户端。随着对WebAPI的每个请求,令牌被发送回并进行身份验证:

$http.defaults.headers.common.Authorization = 'Bearer ' + user.data.bearerToken;

到目前为止,此方法效果很好,但按目前的情况,应用程序无法区分分配了不同角色的用户之间的区别。

某些WebAPI方法只能由具有特定角色的用户执行。我想调整前端AngularJS应用程序的菜单,以便仅当用户具有此角色时,相应的链接才会显示。我确实意识到这不会阻止用户检查HTML和发布,但是我对此并不担心,因为我仍然可以通过方法修饰来限制用户(而不是角色)执行操作的能力。

有人可以给我一个例子,说明我如何使用我在问题中提到的上述产品套件以及JavaScript Web令牌(如果它们有助于使解决方案保持最新)来执行此操作。据我了解,角色是由索偿处理的,但我不了解如何添加索偿并使用令牌将其发送回客户端。我已经在互联网上进行了大量研究,但是我找不到任何很好的例子,因为我认为其中大多数是非常新的,并且没有多少人有机会探索SPA如何使用这些最新软件组件。

在回答此问题时,请注意,我不是在寻找可以告诉社区如何在服务器上设置角色的答案,也不是在说明提供服务器上角色检查的重要性的答案。我认为几乎每个人都知道这一点。我真正认为有用的是一些非常详细的技术建议,包括示例代码和说明。如果没有将不满足此要求的答案发布为建议的答案,则可以使答案始终集中于每个人。

先感谢您。

MK。

您问题的简短答案是ApplicationOAuthProvider.CreateProperties方法。默认情况下,它是为您创建的,位于WebApi2 / Provider / ApplicationOAuthProvider.cs下。默认情况下,它仅发送userName

//WepApi2/Providers/ApplicationOAuthProvider.cs
public static AuthenticationProperties CreateProperties(string userName)
{
    IDictionary<string, string> data = new Dictionary<string, string>
    {
        { "userName", userName }
    };
    return new AuthenticationProperties(data);
}

我将进行以下更新(以防以后需要发送更多用户数据):

public static AuthenticationProperties CreateProperties(string userName, ClaimsIdentity oAuthIdentity)
{ 
  IDictionary<string, string> data = new Dictionary<string, string>
  {
      { "userName", userName},
      { "roles",string.Join(",",oAuthIdentity.Claims.Where(c=> c.Type == ClaimTypes.Role).Select(c => c.Value).ToArray())}

  };
  return new AuthenticationProperties(data);
}

如果您尚未对WebApi项目进行重大更改ApplicationOAuthProvider.CreateProperties(仅在两个地方引用过),只需更新调用代码以将oAuthIdentity随同传递user.UserName,您将获得与访问令牌响应一起发送的用户角色:

{
 "access_token": "ZpxAZyYuvCaWgShUz0c_XDLFqpbC0-DIeXl_tuFbr11G-5hzBzSUxFNwNPahsasBD9t6mDDJGHcuEqdvtBT4kDNQXFcjWYvFP7U2Y0EvLS3yejdSvUrh2v1N7Ntz80WKe5G_wy2t11eT0l48dgdyak8lYcl3Nx8D0cgwlQm-pePIanYZatdPFP9q5jzhD-_k9SF-ARTHgf0ePnbvhLBi1MCYQjvfgPKlbBHt0M5qjwGAeFg1IhSVj0gb4g9QTXoiPhRmxGBmjOpGgzxXixavmrpM7cCBFLoR3DCGnIJo6pwT-6VArxlB8-ZyyOZqh_6gGtptd0lIu8iJRUIGwO9HFNkROdoE9T4buwLnhPpWpy9geBjPVwsB1K3xnbch26YbklhxIHVybBxeIVXd17QTw_LjlQ5TJdqpAYfiZ5B9Nx2AFYYYe3--aemh4y1XOIvN",
 "token_type": "bearer",
 "expires_in": 1209599,
 "userName": "MK",
 "roles": "Admin,Public",
 ".issued": "Fri, 23 May 2014 17:36:54 GMT",
 ".expires": "Fri, 06 Jun 2014 17:36:54 GMT"
}

现在您可以使用角色了,可以使用Angular条件指令根据用户角色显示/隐藏动作。

如果您需要更多说明,请告诉我。

编辑:

使用Authorize属性装饰控制器方法是有效的,因为HttpContext.Current.User.Identity实际上是ClaimsIdentity但是为了不对应用程序内部的硬性代码安全逻辑,我更喜欢使用ClaimsAuthorizationManager

public ActionResult Secure()
{
  if(!ClaimsPrincipalPermission.CheckAccess("resource", "action"))
    return new HttpUnauthorizedResult();

  ViewBag.Message = "You are allowed to perform action on resource.";
  return View();
}

使用RoleManager以下角色创建角色

RoleManager roleManger = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>());
roleManager.Create(new IdentityRole() { Name = "Admin" });

角色分配使用UserManager

userManager.AddToRole(user.Id, "Admin");

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用AngularJS,WebAPI 2和Oauth 2时,如何将授权信息发送回我的客户端应用程序?

来自分类Dev

使用AngularJs,WebAPI和OAuth2时,获得带有JWT的明文用户角色

来自分类Dev

如何使用Oauth2和javascript客户端实现长期登录会话(Spring Oauth2 + Angularjs)

来自分类Dev

使用webapi的AngularJS客户端路由和令牌认证

来自分类Dev

使用OWIN OAuth的MVC 5和WebApi2

来自分类Dev

在WebApi中使用OAuth承载令牌生成和Owin将更多信息返回给客户端

来自分类Dev

OAuth 2中的授权代码在运行服务器的客户端应用程序的生存期内仅使用一次?

来自分类Dev

OAuth 2中的授权代码在运行服务器的客户端应用程序的生命周期中仅使用一次吗?

来自分类Dev

如何使用客户端的angularjs和后端的flask开发Web应用程序?

来自分类Dev

Spring OAuth2和AngularJS应用程序中的身份验证/授权

来自分类Dev

使用授权代码授权和 JWT 使用 OAuth2 通过 spring boot 登录到客户端

来自分类Dev

AngularJS $ http和WebApi 2

来自分类Dev

我应该为ios客户端使用哪种OAuth2授权类型?

来自分类Dev

OAuth2:使用JWT客户端身份验证的JWT授权授予和客户端凭据授予之间有什么区别?

来自分类Dev

如何使用Node.js和NPM创建Web客户端应用程序(如angularjs教程)

来自分类Dev

使用OAuth2客户端和ADFS 3.0制作持久SSO

来自分类Dev

在MVC应用程序中使用SMTP客户端发送和发送电子邮件后,如何删除保存在服务器上的文件

来自分类Dev

OAuth2 WebAPI令牌删除.issueed和.expires

来自分类Dev

如何使StructureMap与AngularJs / MVC5和WebApi2 Web项目一起使用

来自分类Dev

如何使用DatagramPacket和DatagramSocket类创建服务器-客户端应用程序?

来自分类Dev

AngularJS和对Oauth2提供程序的身份验证?

来自分类Dev

使用oAuth 2和FOSOAuthServerBundle跳过授权页面

来自分类Dev

如何将OAuth2身份验证令牌从MVC5 wep应用程序传递到WebAPI2应用程序

来自分类Dev

如何使用ClientID和ClientSecret在Phonegap中使用Angularjs登录Google OAuth2

来自分类Dev

如何从 Django 请求中获取 oauth2 客户端应用程序

来自分类Dev

我应该如何在boost :: asio的客户端应用程序中同时使用async_read_until和async_write?

来自分类Dev

如何使用OAuth2和Mock测试资源

来自分类Dev

SessionAuthentication vs OAuth2Authentication可与Django和Angularjs一起使用

来自分类Dev

如何在.net WebApi2应用程序的OAuth2令牌请求中使用额外的参数

Related 相关文章

  1. 1

    使用AngularJS,WebAPI 2和Oauth 2时,如何将授权信息发送回我的客户端应用程序?

  2. 2

    使用AngularJs,WebAPI和OAuth2时,获得带有JWT的明文用户角色

  3. 3

    如何使用Oauth2和javascript客户端实现长期登录会话(Spring Oauth2 + Angularjs)

  4. 4

    使用webapi的AngularJS客户端路由和令牌认证

  5. 5

    使用OWIN OAuth的MVC 5和WebApi2

  6. 6

    在WebApi中使用OAuth承载令牌生成和Owin将更多信息返回给客户端

  7. 7

    OAuth 2中的授权代码在运行服务器的客户端应用程序的生存期内仅使用一次?

  8. 8

    OAuth 2中的授权代码在运行服务器的客户端应用程序的生命周期中仅使用一次吗?

  9. 9

    如何使用客户端的angularjs和后端的flask开发Web应用程序?

  10. 10

    Spring OAuth2和AngularJS应用程序中的身份验证/授权

  11. 11

    使用授权代码授权和 JWT 使用 OAuth2 通过 spring boot 登录到客户端

  12. 12

    AngularJS $ http和WebApi 2

  13. 13

    我应该为ios客户端使用哪种OAuth2授权类型?

  14. 14

    OAuth2:使用JWT客户端身份验证的JWT授权授予和客户端凭据授予之间有什么区别?

  15. 15

    如何使用Node.js和NPM创建Web客户端应用程序(如angularjs教程)

  16. 16

    使用OAuth2客户端和ADFS 3.0制作持久SSO

  17. 17

    在MVC应用程序中使用SMTP客户端发送和发送电子邮件后,如何删除保存在服务器上的文件

  18. 18

    OAuth2 WebAPI令牌删除.issueed和.expires

  19. 19

    如何使StructureMap与AngularJs / MVC5和WebApi2 Web项目一起使用

  20. 20

    如何使用DatagramPacket和DatagramSocket类创建服务器-客户端应用程序?

  21. 21

    AngularJS和对Oauth2提供程序的身份验证?

  22. 22

    使用oAuth 2和FOSOAuthServerBundle跳过授权页面

  23. 23

    如何将OAuth2身份验证令牌从MVC5 wep应用程序传递到WebAPI2应用程序

  24. 24

    如何使用ClientID和ClientSecret在Phonegap中使用Angularjs登录Google OAuth2

  25. 25

    如何从 Django 请求中获取 oauth2 客户端应用程序

  26. 26

    我应该如何在boost :: asio的客户端应用程序中同时使用async_read_until和async_write?

  27. 27

    如何使用OAuth2和Mock测试资源

  28. 28

    SessionAuthentication vs OAuth2Authentication可与Django和Angularjs一起使用

  29. 29

    如何在.net WebApi2应用程序的OAuth2令牌请求中使用额外的参数

热门标签

归档