我有一个简单的设置。 Angular2客户端和dotnet核心webapi服务器。强制窗口验证,所以没有登录/注册页面。 在客户端,我需要知道当前用户是否具有特定权限。假设他可以是用户,高级用户或管理员。必须通过Active Directory(特定组的成员?其他?)分配这些角色。 问题是如何在客户端获得用户的角色?
到目前为止,第一个请求(对于index.html)看起来像这样:
Request URL:http://localhost:5000/
Request Method:GET
Status Code:200 OK
Remote Address:[::1]:5000
Response Headers:
Accept-Ranges:bytes
Access-Control-Allow-Origin:*
Content-Encoding:gzip
Content-Type:text/html
Date:Sat, 11 Mar 2017 23:00:17 GMT
ETag:"1d29abb3a9b8e62"
Last-Modified:Sat, 11 Mar 2017 23:00:08 GMT
Persistent-Auth:true
Server:Kestrel
Transfer-Encoding:chunked
Vary:Accept-Encoding
WWW-Authenticate:Negotiate oRswGaADCgEAoxIEEAEAAAAgBHIw6Z3ltQAAAAA=
X-Powered-By:ASP.NET
X-SourceFiles:=?UTF-8?B?QzpcUHJvamVjdHNcSGxyXFplbml0aFxaZW5pdGguV2Vi?=
X-StackifyID:V1|a92d413d-a6f2-41f5-82d4-d561bcfb7ea4|
Request Headers:
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch, br
Accept-Language:en-US,en;q=0.8
Authorization:Negotiate oXcwdaADCgEBoloEWE5UTE1TU1AAAwAAAAAAAABYAAAAAAAAAFgAAAAAAAAAWAAAAAAAAABYAAAAAAAAAFgAAAAAAAAAWAAAABXCiOIKADk4AAAAD2dOupNeJw531jZD2IvezcmjEgQQAQAAAF0+6pxdYvmTAAAAAA==
Cache-Control:no-cache
Connection:keep-alive
Cookie:_ga=GA1.1.1850763475.1487368913
Host:localhost:5000
Pragma:no-cache
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36
第二个:
Request URL:http://localhost:5000/inline.bundle.js
Request Method:GET
Status Code:200 OK
Remote Address:[::1]:5000
Response Headers:
Accept-Ranges:bytes
Access-Control-Allow-Origin:*
Content-Encoding:gzip
Content-Type:application/javascript
Date:Sat, 11 Mar 2017 23:00:18 GMT
ETag:"1d29abb3a9b9a84"
Last-Modified:Sat, 11 Mar 2017 23:00:08 GMT
Persistent-Auth:true
Server:Kestrel
Transfer-Encoding:chunked
Vary:Accept-Encoding
X-Powered-By:ASP.NET
X-SourceFiles:=?UTF-8?B?QzpcUHJvamVjdHNcSGxyXFplbml0aFxaZW5pdGguV2ViXGlubGluZS5idW5kbGUuanM=?=
X-StackifyID:V1|9ab31082-9a9d-4513-8e8c-ae83e8163117|
Request Headers:
Accept:*/*
Accept-Encoding:gzip, deflate, sdch, br
Accept-Language:en-US,en;q=0.8
Cache-Control:no-cache
Connection:keep-alive
Cookie:_ga=GA1.1.1850763475.1487368913
Host:localhost:5000
Pragma:no-cache
Referer:http://localhost:5000/
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36
和webapi的那个:
Request URL:http://localhost:5000/mymethod
Request Method:GET
Status Code:200 OK
Remote Address:[::1]:5000
Response Headers:
Access-Control-Allow-Origin:*
Content-Type:application/json; charset=utf-8
Date:Sat, 11 Mar 2017 23:00:19 GMT
Persistent-Auth:true
Server:Kestrel
Transfer-Encoding:chunked
X-Powered-By:ASP.NET
X-SourceFiles:=?UTF-8?B?QzpcUHJvamVjdHNcSGxyXFplbml0aFxaZW5pdGguV2ViXGFwaVxjb25maWd1cmF0aW9uXHZlcnNpb24=?=
X-StackifyID:V1|0f198f5d-a0fe-4e6c-974a-bd31f0d32ec6|
Request Headers:
Accept:application/json, text/plain, */*
Accept-Encoding:gzip, deflate, sdch, br
Accept-Language:en-US,en;q=0.8
Cache-Control:no-cache
Connection:keep-alive
Cookie:_ga=GA1.1.1850763475.1487368913
Host:localhost:5000
Pragma:no-cache
Referer:http://localhost:5000/
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36
我可以采取什么方法来获取用户权限(并通过......将其保留在客户端)并将其用于路线保护?
也可能是页面在加载过程中进行了几次webapi调用。我是否每次呼叫都会授权用户或以某种方式使用以前的呼叫结果?
谢谢。
答案 0 :(得分:1)
我认为这篇文章是angularjs& amp;的一个很好的起点。集成的Windows身份验证。
CodeProject : AngularJS-Web-API-Active-Directory-Security
关于第二个问题,您可以使用带有用户名,角色,到期时间的加密令牌,并在每次请求时解密此令牌服务器端并将其用于服务器端。
您还可以在每个请求上续订令牌,然后将其重新发送给客户端,以便更新其会话信息。
答案 1 :(得分:1)
如果您确实希望使用AD组作为授权,则需要设置权限服务,该服务通过webapi方法查询AD,并使用hot observable传播权限,而无需不断重新查询AD。
在您的webapi方法中:
public List<string> GetUserPermissions(){
List<string> permissionsList = new List<string>();
if (User.IsInRole("PowerUsers")){
permissionsList.Add("PowerUsers");
}
if (User.IsInRole("Admin")) {
permissionsList.Add("Admin");
}
if (User.IsInRole("User")) {
permissionsList.Add("User");
}
return permissionsList;
}
基本上,您需要在许可服务中按照以下方式执行操作:
permissions: any[] = [];
initPermissions(): void {
this.getPermissions().subscribe(perms => this.permissions = perms);
}
getPermissions(): Observable<any> {
return this.http.get(`${this.baseUrl}/api/Permissions/GetUserPermissions`)
.publishLast().refCount();
}
isInRole(roleName: string): boolean{
return this.permissions.some(perm => perm === roleName);
}
在你的app.component中,ngInit()从你的服务中调用initPermissions()方法。
然后,您需要将权限服务导入到要使用它的组件中,在构造函数private permissions: permissionsService
中创建权限,您可以执行像*ngIf="permissions.isInRole('Admin')"
这样的很酷的东西来隐藏功能并使用内部认证警卫和诸如此类的东西。您可能仍然希望在您的网络API方法上使用授权装饰器来保护您的数据。
请注意,上述内容不是我的实际权限代码,因此您可能需要对其进行调试才能使其正常工作。你可能也希望改进它,它只是给你一些想法。