OWIN WebApi多次身份验证,OAuth承载身份验证中间件

时间:2017-11-06 08:15:35

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

我希望WebApi具有多个身份验证。我打算在控制器的操作上使用AuthorizeAttribute启用/禁用它,例如MyAuthOne,MyAuthTwo

然后我想使用用户并使用声明。

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

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

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

2 个答案:

答案 0 :(得分:0)

我没有看到这一点,为什么你使用不记名身份验证但不想使用它(我想我不太了解你的帖子)

如果您想使用声明,则非常简单。

如果您提供由应用程序创建的令牌,则必须提供自己的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;
    }
}

答案 1 :(得分:0)

我找到了问题的答案:

  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”]为OwinContext;

    var authenticationResult = await ctx.Authentication.AuthenticateAsync(new [] {“Bearer”})

    //我在AuthenticateResult中声明了 // https://msdn.microsoft.com/en-us/library/microsoft.owin.security.authenticateresult(v=vs.113).aspx

  3. 设置主要上下文.Principal = authenticationResult ...

  4. 感谢您的回答