asp.net web api 2自定义owin auth中间件使用授权属性

时间:2017-06-13 14:25:36

标签: authentication asp.net-web-api owin claims-based-identity

我正在构建一个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!!!");
        }
    }

0 个答案:

没有答案