this example
.我的客户端浏览器目标是IE9及以上。
注意,我从上面的例子做了一些小的改变,因为我不urlencode使用转换发送到服务器的所有数据。相反我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更新2和在服务器上,我使用C#,最新的Entity框架和sql Server 2012。
要登录我的客户端,调用/ Token方法到WebAPI,并传递用户ID和密码。 WebAPI然后用令牌来响应我存储的客户端。每次请求WebAPI时,令牌都会发送回来并进行身份验证:
$http.defaults.headers.common.Authorization = 'Bearer ' + user.data.bearerToken;
这到目前为止工作得很好,但是它的应用程序无法分辨具有不同角色分配给他们的用户之间的区别。
某些WebAPI方法只能由具有特定角色的用户执行。我想调整我的前端AngularJS应用程序的菜单,以便只有当用户有这个角色,那么相应的链接将显示为可见。我意识到,这不会阻止用户检查HTML和发布,但我不担心这一点,因为我仍然会有方法装饰,以限制用户不在角色执行操作的能力。
有人可以给我一个例子,如何我可以做只使用上面提到的产品套件,我提到的问题加上JavaScript Web Tokens如果他们帮助使解决方案更新。从我理解的角色由声明处理,但我不知道如何添加这些和发送他们回到客户端与令牌。我已经在互联网上做了很多研究,但我没有能够找到任何好的例子,因为我认为大部分是非常新的,没有很多人有机会探索如何SPA可以使用这些最新的软件组件。
当回答这个问题时,请注意,我不是在寻找一个答案,可以告诉社区如何在服务器上设置角色或答案,解释在服务器上提供角色检查是多么重要。我想几乎每个人都知道这一点。我真正认为将使用的是一些非常详细的技术建议与示例代码和解释。为了保持回答的重点,它可能会帮助大家,如果不满足这个需求的答案不会发布为建议的答案。
先谢谢你。
解决方法
//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> { { "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仅在两个位置引用,只是更新调用代码以与user.UserName一起传递oAuthIdentity,您将获得与访问一起发送的用户角色令牌响应:
{ "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" }
现在您有可用的角色,您可以使用角度条件指令根据用户角色显示/隐藏操作。
如果您需要更多说明,请告诉我。
编辑:
使用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");