我正在构建一个web api,我想使用内置的基础架构来处理角色,如果用户没有所需的角色,则拒绝用户访问。 api将作为现有站点上的应用程序运行,使用站点cookie进行身份验证。
出于身份验证的目的,我创建了一个简单的自定义中间件,其中验证了cookie,如果发现有效,则会创建具有适当角色的身份。
当请求到达拒绝访问的控制器时,会出现问题。由于我在自定义中间件中创建的身份位于owin上下文中,而不是在HttpContext.Current.User.Identity中,我认为它应该位于Authorize属性才能正常工作。
如何解决身份处于“错误”背景下的问题?
using Owin;
using ThgDataApi.Security;
namespace ThgDataApi.App_Start
{
public partial class Startup
{
public void ConfigureAuth(IAppBuilder app)
{
app.Use(typeof(ApiCookieAuthMiddleware));
}
}
}
为了简单起见,Cookie逻辑已经简化了。
public class ApiCookieAuthMiddleware : OwinMiddleware
{
public ApiCookieAuthMiddleware(OwinMiddleware next) : base(next)
{
}
public override async Task Invoke(IOwinContext context)
{
if (context.Request.Cookies.Any(x => x.Key == "c"))
{
var identity = new ClaimsIdentity();
identity.AddClaim(new Claim(ClaimTypes.Role, "User"));
context.Authentication.SignIn(identity);
await Next.Invoke(context);
}
else
{
context.Response.StatusCode = 401;
context.Response.ReasonPhrase = "some error";
return;
}
}
}
控制器
[Authorize(Roles = "User")]
public class TestController : ApiController
{
[HttpGet]
public IHttpActionResult GetHello()
{
return Ok("Hello World!!!");
}
}