在这个例子中,我让用户登录到(MVC 5)Web应用程序,该应用程序然后充当代理以登录(Web API 2)API(使用基本的SSL)并返回承载/访问令牌.我正在使用Thinktecture.IdentityModel.Client.OAuth2Client来处理登录并获取访问令牌,这一切都正常.
其他一些事情发生但现在我希望Web应用程序能够解码访问令牌以访问API上的声明集(特别是登录API后返回的用户ID).
我正在使用带有令牌端点的大量演示UseOAuthAuthorizationServer和UseOAuthBearerAuthentication扩展方法,几乎开箱即用,但有一个自定义OAuthAuthorizationServerOptions.Provider来访问我自己的存储库.
我在两个应用程序上都有相同的MachineKey,但我不清楚如何解码令牌,虽然我知道我可能不得不使用该SecureDataFormat.Unprotect方法.
我在Web应用程序中最接近的尝试是:
Task<TokenResponse> response = client.RequestResourceOwnerPasswordAsync(model.Email, model.Password);
IDataProtector dataProtecter = Startup.DataProtectionProvider.Create("does this matter?");
TicketDataFormat ticketDataFormat = new TicketDataFormat(dataProtecter);
AuthenticationTicket ticket = ticketDataFormat.Unprotect(response.Result.AccessToken);
Run Code Online (Sandbox Code Playgroud)
使用Startup.DataProtectionProvider设置如下:
public partial class Startup
{
internal static IDataProtectionProvider DataProtectionProvider { get; private set; }
public void Configuration(IAppBuilder app)
{
DataProtectionProvider = app.GetDataProtectionProvider();
this.ConfigureAuth(app);
}
}
Run Code Online (Sandbox Code Playgroud)
我的后退计划是提供一种API方法,在登录后返回我感兴趣的信息,但看起来过多,因为它构成了令牌中声明的一部分(据我了解).
我试图绕过JWT(我看过Thinktecture,微软的源代码和各种其他论坛),但不确定这是否有帮助(尽管声明在纯文本中可用我们很有用).我还没有找到允许使用基本身份验证登录并返回包含访问令牌的自定义JWT的示例.
无论如何,我希望这些信息和任何帮助都会受到赞赏...欢呼
access-token jwt oauth2client asp.net-mvc-5 asp.net-web-api2
我有一个 .NET Web API,允许客户端返回人员和相关数据的详细信息。系统中有许多非固定角色(它是多租户的),每个角色都可以访问特定字段,例如管理员可以看到出生日期,非管理员不能。
该应用程序的结构是:
客户端控制器 > 业务/服务层 > 存储库 > 数据库
目前,数据访问是通过用于添加/更新/删除的 EntityFramework 和用于查询的 Dapper 组合来管理的。
我的问题是:是否有一种例外的标准/通用方法可以在字段级别过滤发送到客户端的数据,并在更新数据库中的模型之前从客户端返回?理想情况下,如果有一些示例代码或应用程序来演示该方法。
我对此的最初想法是在将 ViewModel 发送到客户端之前对其进行过滤,并在更新 EntityFramework 模型之前执行检查,但这似乎是脱节的。而且我也不是 100% 认为这两种方法都是最好的。
我考虑过的其他可能是:
我不知道有任何框架可以提供字段级安全性,但许多商业产品提供了非常可配置的字段级安全性,例如 SalesForce、Microsoft CRM 等。本质上,我想实现类似的东西,但规模较小。
基本上我正在尝试获取当前访问Web Api的经过身份验证的用户(通过承载令牌)的当前声明集; 通过将当前主体注入到辅助类中,然后将其注入到注入ApiController的类中.
但是,返回的主体永远不是我想要的主体,因为它未经过身份验证且不包含任何声明.如果我在创建ApiController之后逐步执行它的构造函数,则正确设置本地ApiController.User主体值.
以下是我创建并链接到下面的示例解决方案的一些代码...
集装箱登记:
namespace PrincipalInjector
{
using System.Security.Principal;
using System.Threading;
using System.Web;
using System.Web.Http;
using SimpleInjector;
using SimpleInjector.Integration.WebApi;
public static class ContainerConfig
{
public static void Register(HttpConfiguration config)
{
Container container = new Container();
InitializeContainer(container);
container.RegisterWebApiControllers(config);
container.Verify();
config.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container);
}
private static void InitializeContainer(Container container)
{
container.RegisterWebApiRequest<IPrincipal>(() =>
HttpContext.Current.User != null ? HttpContext.Current.User : Thread.CurrentPrincipal);
}
}
}
Run Code Online (Sandbox Code Playgroud)
样品控制器:
namespace PrincipalInjector.Controllers
{
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Security.Principal;
using System.Web.Http;
public class DefaultController …Run Code Online (Sandbox Code Playgroud)