如何在Web API身份验证服务中获取AuthTicket中包含的声明?

Pro*_*ofK 6 c# authentication wpf claims-based-identity asp.net-web-api

我有一个带有auth服务的Web API,对于WPF客户端,设置如下:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.SuppressDefaultHostAuthentication();
        config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

public partial class Startup
{
    public void ConfigureAuth(IAppBuilder app)
    {
        ...
        OAuthOptions = new OAuthAuthorizationServerOptions
        {
            TokenEndpointPath = new PathString("/Token"),
            Provider = new ApplicationOAuthProvider(PublicClientId),
            ApplicationCanDisplayErrors = true,
            AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
            AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
            AllowInsecureHttp = true, // TODO Make false to deploy
        };
        app.UseOAuthAuthorizationServer(OAuthOptions);
    }
}
Run Code Online (Sandbox Code Playgroud)

/Token到目前为止我只使用端点,因为它至少授予我持票人令牌.我在成功验证时收到的票证有问题和到期日期,持有人令牌和我的用户名.

如何获得用户的声明(以及可能的角色)?我可以在这里做些什么,或者我是否会在auth之后通过API请求它们,并将它们和Auth Ticket聚合在一起,就像PrincipalWPF客户端的对象一样?

我是否可以在WPF应用程序中包含一些Identity组件,以帮助从令牌中提取声明,以及有关如何执行此操作的任何建议?

ste*_*-fu 5

我认为允许客户端解密令牌是相当危险的。如果他们能做到这一点,恶意行为者就可以修改令牌和其中的声明。如果您不检查声明的有效性(可能因为它们是由第三方提供的),那么可能会导致权限升级和应用程序受到损害。

如果客户端应用程序需要声明 - 也许是为了 UI 布局,那么您可以将它们单独提供给令牌。实现此目的的一种方法是通过ActionFilterAttribute将声明写入自定义 http 标头。如果此处的声明被篡改,它只会影响客户端,因为您将在处理任何请求之前检查令牌内的安全声明。

public AddClaimsAttribute : System.Web.Http.Filters.ActionFilterAttribute
{
     var principal = actionExecutedContext.ActionContext.RequestContext.Principal as ClaimsPrincipal;

    if (principal != null)
    {
        var claims = principal.Claims.Select(x => x.Type + ":" + x.Value).ToList();

        actionExecutedContext.Response.Content.Headers.Add("Claims",
           String.Join(",", claims));
    }

}
Run Code Online (Sandbox Code Playgroud)

然后,您的客户端只需要检查此标头并解析它。

这是一个基本示例,您可以将其格式化为 JSON 或添加一系列自定义标头“IsAdmin”、“IsEditingUser”等。

因为它是一个过滤器,所以您可以根据需要将其全局应用于每个请求、控制器上的每个操作或特定操作。