ServiceStack 和 .NET Core 中间件
ServiceStack and .NET Core Middleware
我想知道是否可以在 .NET 核心上使用 ServiceStack 和中间件。
我的用例是,我想用 ServiceStack 实现 API,并使用授权策略和 openid 连接中间件,例如 IdentityServer4.AccessTokenValidation。
如果没有,是否有任何替代方法来设置 ServiceStack 以与 openid 连接服务器一起工作?
您可以在与 .NET Core 应用程序中的 ServiceStack 相同的 AppHost 中注册 .NET Core 中间件,因为 ServiceStack is just another middleware in the pipeline itself but ServiceStack built-in Authentication attributes and features 不会知道任何外部身份验证实现。
要获得更集成的解决方案,请查看社区贡献的 ServiceStack.Authentication.IdentityServer,其中包括用于 IdentityServer 的 ServiceStack AuthProvider。
我用以下代码粘合了 ServiceStack 和 .NET Core。我不确定这是否是实现目标的最佳方式,但到目前为止它是有效的。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class AuthorizeAttribute : RequestFilterAsyncAttribute, IAuthorizeData
{
public AuthorizeAttribute(ApplyTo applyTo)
: base(applyTo)
{
Priority = -100;
}
public AuthorizeAttribute()
: this(ApplyTo.All)
{
}
public string Policy { get; set; }
public string Roles { get; set; }
public string AuthenticationSchemes { get; set; }
public override async Task ExecuteAsync(IRequest req, IResponse res, object requestDto)
{
var policyProvider = req.TryResolve<IAuthorizationPolicyProvider>();
var filter = new AuthorizeFilter(policyProvider, new[] {this});
var webRequest = req.OriginalRequest as HttpRequest;
var actionContext = new ActionContext(webRequest.HttpContext, new RouteData(), new ActionDescriptor());
var context = new AuthorizationFilterContext(actionContext, new List<IFilterMetadata>());
await filter.OnAuthorizationAsync(context);
if (context.Result is ChallengeResult)
{
res.StatusCode = 401;
res.EndRequest();
}
else if (context.Result is ForbidResult)
{
res.StatusCode = 403;
res.EndRequest();
}
}
}
我想知道是否可以在 .NET 核心上使用 ServiceStack 和中间件。
我的用例是,我想用 ServiceStack 实现 API,并使用授权策略和 openid 连接中间件,例如 IdentityServer4.AccessTokenValidation。
如果没有,是否有任何替代方法来设置 ServiceStack 以与 openid 连接服务器一起工作?
您可以在与 .NET Core 应用程序中的 ServiceStack 相同的 AppHost 中注册 .NET Core 中间件,因为 ServiceStack is just another middleware in the pipeline itself but ServiceStack built-in Authentication attributes and features 不会知道任何外部身份验证实现。
要获得更集成的解决方案,请查看社区贡献的 ServiceStack.Authentication.IdentityServer,其中包括用于 IdentityServer 的 ServiceStack AuthProvider。
我用以下代码粘合了 ServiceStack 和 .NET Core。我不确定这是否是实现目标的最佳方式,但到目前为止它是有效的。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class AuthorizeAttribute : RequestFilterAsyncAttribute, IAuthorizeData
{
public AuthorizeAttribute(ApplyTo applyTo)
: base(applyTo)
{
Priority = -100;
}
public AuthorizeAttribute()
: this(ApplyTo.All)
{
}
public string Policy { get; set; }
public string Roles { get; set; }
public string AuthenticationSchemes { get; set; }
public override async Task ExecuteAsync(IRequest req, IResponse res, object requestDto)
{
var policyProvider = req.TryResolve<IAuthorizationPolicyProvider>();
var filter = new AuthorizeFilter(policyProvider, new[] {this});
var webRequest = req.OriginalRequest as HttpRequest;
var actionContext = new ActionContext(webRequest.HttpContext, new RouteData(), new ActionDescriptor());
var context = new AuthorizationFilterContext(actionContext, new List<IFilterMetadata>());
await filter.OnAuthorizationAsync(context);
if (context.Result is ChallengeResult)
{
res.StatusCode = 401;
res.EndRequest();
}
else if (context.Result is ForbidResult)
{
res.StatusCode = 403;
res.EndRequest();
}
}
}