【问题标题】:OWIN WebApi multiple authentications, OAuth Bearer authentication middlewareOWIN WebApi多重认证,OAuth Bearer认证中间件
【发布时间】:2017-11-06 08:15:35
【问题描述】:

我希望 WebApi 具有多个身份验证。我计划在控制器的操作上使用 AuthorizeAttribute 启用/禁用它,例如我的AuthOne,我的AuthTwo

然后我想使用 User 并处理声明。

我的 WebApi 服务器配置中有 appBuilder.UseOAuthBearerAuthentication(xxx)

问题:当请求在请求授权标头中带有有效令牌时,中间件验证令牌并设置用户主体。

问题:如何禁用中间件并且不对 Authentification 标头做出反应?也许我只需要在我的过滤器中覆盖 Principal 或者我的方式不正确?

【问题讨论】:

    标签: authentication asp.net-web-api2 owin


    【解决方案1】:

    我不明白这一点,为什么您使用不记名身份验证但不想使用它(我想我不太了解您的帖子)

    如果你想使用声明,这很简单。

    如果您提供由您的应用程序创建的令牌,您必须提供您自己的 ServerOptions

        OAuthAuthorizationServerOptions authServerOptions = new OAuthAuthorizationServerOptions
        {
            AllowInsecureHttp = true,
            TokenEndpointPath = new PathString("/token"),
            AccessTokenExpireTimeSpan = TimeSpan.FromDays(30),
            Provider = new AuthorizationServerProvider(),
        };
    

    AuthorizationServerProvider 是您自己的实现:

    public class AuthorizationServerProvider : OAuthAuthorizationServerProvider
    

    你覆盖的地方

    public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {
        await Task.Run(() => Login(context));
    }
    
    private void Login(OAuthGrantResourceOwnerCredentialsContext ctx)
    {
        Guid? userid = userservice.GetId(ctx.UserName, ctx.Password);
        if (userid != null)
        {
            ////here you can start with your claim stuff
            ClaimsIdentity identity = new ClaimsIdentity(new List<Claim> { new Claim("userId", userid.ToString()) }, OAuthDefaults.AuthenticationType);
            identity.AddClaim(new Claim(ClaimTypes.Name, ctx.UserName));
            ctx.Validated(identity);
            return;
        }        
    }
    

    那么就可以使用授权属性了

    public class UserAuthorizationAttribute : AuthorizeAttribute
    {
        protected override bool IsAuthorized(HttpActionContext ctx)
        {
            return base.IsAuthorized(ctx) && CheckUserAuthorization(ctx.Request.GetOwinContext().Authentication);
        }
    
        private bool CheckUserAuthorization(IAuthenticationManager manager)
        {
            var claim = manager.User.Claims.FirstOrDefault(x => x.Type == "user_identifier");
            if (claim != null)
            {
                Guid identifier = new Guid(claim.Value);
                //// evaluate the claim, etc...
                return true;
            }
    
            return false;
        }
    }
    

    【讨论】:

    • 我已启用 appBuilder.UseOAuthBearerAuthentication()。我有标题请求:1.“授权”:“Bearer XXX”2.“MyHeader”:“MyHeaderValue”然后在我的控制器中我得到: User.Identity.AuthenticationType: JWT User.Identity.IsAythenticated: true 为什么 IsAythenticated 是真的?这是否意味着中间件验证令牌并设置主体?我可以覆盖本金吗?我可以如何以及在何处管理用户声明主体?
    • 我对相同请求的期望:public MyController { [HttpGet] [BearerTokenAuthorize] public async Task GetCar() { User.Identity.AuthenticationType: JWT User.Identity.IsAythenticated: true } [ HttpGet] [MyCustomAuthorize] public async Task GetBus() { User.Identity.AuthenticationType: MyCustom User.Identity.IsAythenticated: true } }
    • 事实上,如果您使用 owin auth,它会在 owin 管道中的身份验证阶段设置...github.com/yreynhout/katana-clone/blob/master/src/… 因此,如果您使用授权属性,则始终会处理它,授权提供者只会为您,可以由我们的代码评估/或者如果您使用默认属性,实际上将身份验证设置为 true,请参阅我的代码,由您来编写自己的属性
    • 我希望你把代码不在 cmets 中,通常很难理解你想要什么
    【解决方案2】:

    我找到了问题的答案:

    1. 我需要使用 AuthenticationMode.Passive 启用 OAuth owin 中间件。
    2. 在我的自定义 BeareTokenAuthenticationFilter 中,我需要调用 owin 中间件并验证令牌:
    OwinContext ctx = null;
    var request = context.Request;
    
    if (request.Properties.ContainsKey("MS_OwinContext"))
       ctx = request.Properties["MS_OwinContext"] as OwinContext;
    
    var authenticationResult = await ctx.Authentication.AuthenticateAsync(new[] {"Bearer"})
    
    // and I have claims in AuthenticateResult
    // https://msdn.microsoft.com/en-us/library/microsoft.owin.security.authenticateresult(v=vs.113).aspx
    
    1. 设置主体上下文。主体 = authenticationResult...

    谢谢你的回答

    【讨论】:

      猜你喜欢
      • 2014-09-24
      • 1970-01-01
      • 1970-01-01
      • 2019-02-15
      • 2021-08-02
      • 2014-07-13
      • 2023-01-11
      • 2012-05-05
      • 1970-01-01
      相关资源
      最近更新 更多