Winform使用声明调用ASP.NET Web API

时间:2014-01-23 22:42:22

标签: asp.net .net winforms asp.net-web-api

我有一个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客户端获取声明身份吗?

1 个答案:

答案 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逻辑的各个部分。

希望这会有所帮助:)