我希望WebApi具有多个身份验证。我打算在控制器的操作上使用AuthorizeAttribute启用/禁用它,例如MyAuthOne,MyAuthTwo
然后我想使用用户并使用声明。
我的WebApi服务器配置中有appBuilder.UseOAuthBearerAuthentication(xxx)
问题:当请求在请求授权标头中附带有效令牌时,中间件会对令牌进行身份验证并设置用户主体。
问题:如何禁用中间件并且不对Authentification标头做出反应?也许我只是在我的过滤器中覆盖Principal,或者我的方式不正确?
答案 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)
我找到了问题的答案:
在我的自定义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
设置主要上下文.Principal = authenticationResult ...
感谢您的回答