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组件,以帮助从令牌中提取声明,以及有关如何执行此操作的任何建议?
我认为允许客户端解密令牌是相当危险的。如果他们能做到这一点,恶意行为者就可以修改令牌和其中的声明。如果您不检查声明的有效性(可能因为它们是由第三方提供的),那么可能会导致权限升级和应用程序受到损害。
如果客户端应用程序需要声明 - 也许是为了 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”等。
因为它是一个过滤器,所以您可以根据需要将其全局应用于每个请求、控制器上的每个操作或特定操作。
| 归档时间: |
|
| 查看次数: |
2989 次 |
| 最近记录: |