我有一个AngularJS
客户端应用程序,它使用javascript
Oauth2(而不是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如何使用这些最新软件组件。
在回答此问题时,请注意,我不是在寻找可以告诉社区如何在服务器上设置角色的答案,也不是在说明提供服务器上角色检查的重要性的答案。我认为几乎每个人都知道这一点。我真正认为有用的是一些非常详细的技术建议,包括示例代码和说明。如果没有将不满足此要求的答案发布为建议的答案,则可以使答案始终集中于每个人。
先感谢您。
您问题的简短答案是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] 删除。
我来说两句