我有一个Winform客户端,我们正在减慢将内联SQL数据调用更改为ASP.NET Web API调用。我们目前在Winform客户端中使用WindowsPrincipal.IsInRole检查来确定用户是否可以运行SQL数据调用。我们希望进入声明类型设置,其中Winform客户端和Web API都可以检查用户的角色“声明”。
我似乎无法找到关于如何获取Winform客户端的任何“好”文章(1.将声明传递给服务)和(2.在Winform客户端内使用声明检查,如IsInRole)。任何帮助或推动正确的方向都会很棒。
- 编辑
所以我使用这篇文章http://zamd.net/2012/05/04/claim-based-security-for-asp-net-web-apis-using-dotnetopenauth/作为从服务器获取令牌的示例,但文章没有说明如何从http客户端获取声明身份。知道如何从http客户端获取声明身份吗?
答案 0 :(得分:-1)
虽然我没有测试过这段代码,但希望它会让你朝着正确的方向前进。
我相信你在ClaimsAuthenticationManager中回答你的问题,在验证从服务器收到的令牌时你设置了 Thread.CurrentPrincipal - 就像你在网上做的那样没有设置HttpContext.Current.User主体。
再次对此进行测试,但我认为它看起来像这样......
在我的令牌验证器中,我有以下代码:
public static ClaimsPrincipal ValidateToken(string token)
{
var tokenHandler = new JwtSecurityTokenHandler();
ClaimsPrincipal claimsPrincipal = tokenHandler.ValidateToken(new JwtSecurityToken(token),
Constants.TokenValidationParameters);
return FederatedAuthentication.FederationConfiguration
.IdentityConfiguration
.ClaimsAuthenticationManager.Authenticate(token, claimsPrincipal);
}
public static string GetToken(string username, string password)
{
OAuth2Client client = Constants.OAuth2Client;
AccessTokenResponse response = client.RequestAccessTokenUserName(username.ToLower(), password,
Constants.AllowedAudience);
return response.AccessToken;
}
在我的ClaimsAuthenticationManager中,我修改了以下代码,因为您不想在非Web环境中设置HttpContext:
public override ClaimsPrincipal Authenticate(string resourceName, ClaimsPrincipal incomingPrincipal)
{
if (!incomingPrincipal.Identity.IsAuthenticated)
{
return base.Authenticate(resourceName, incomingPrincipal);
}
/* HttpContext.Current.User = */ Thread.CurrentPrincipal = incomingPrincipal;
return incomingPrincipal;
}
我相信你只需要在app.config中设置相应的键,特别是system.identityModel => identityConfiguration => claimsAuthenticationManager
一旦运行的线程具有“Authenticated Principal”,您应该能够调用ClaimsPrincipal.Current.HasClaim() or your higher level Authorization.CheckAccess()
函数来验证WinForm逻辑的各个部分。
希望这会有所帮助:)