我使用AuthenticationHandler:DelegatingHandler在web api中实现了基本身份验证和授权。
因此,在调用任何api之前,会执行此处理程序中的代码,该代码基本上会检查用户是否经过身份验证。
为每个api调用执行此处理程序。现在我的问题是,对于少数api,如登录或注册等,用户没有登录,我不需要检查用户身份验证,我怎么能通过这个。
请帮忙
答案 0 :(得分:1)
您不应该在身份验证和授权之间感到困惑。
基本上,您的AuthenticationHandler
应仅对用户进行身份验证,设置用户身份。
身份验证的目的是说明该用户是谁(经理,出纳员,匿名用户......)。你不应该在这里拒绝这个请求,这是为了授权。示例代码:
public class AuthHandler : DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request,
CancellationToken cancellationToken)
{
//authenticate with your data storage (user,password), or decrypt the information from request's token (I don't know what approach you're doing)
// here I hardcode just for demo
//If the user is authenticated (not an anonymous user)
//create a identity for that user and set the roles for
//the user. The roles could come from your db or your decrypted token depending on how you implement your code.
GenericIdentity MyIdentity = new ClaimsIdentity("MyUser");
String[] MyStringArray = {"Manager", "Teller"};
GenericPrincipal MyPrincipal = new GenericPrincipal(MyIdentity, MyStringArray);
//Set the authenticated principal here so that we can do authorization later.
Thread.CurrentPrincipal = MyPrincipal;
if (HttpContext.Current != null)
HttpContext.Current.User = MyPrincipal;
return await base.SendAsync(request, cancellationToken);
}
}
在身份验证之后进行授权,以验证用户是否有权访问某个功能。这可以通过应用AuthorizeAttribute:
来实现在您的情况下,您可以:
AuthHandler
中设置身份。旁注:今天最突出的授权方法是claims based security。如果你有时间,你应该花一些时间来调查。基本上,这个想法是相似的,只是我们使用声明而不是角色进行授权。
使用基于声明的web api,您可以通过覆盖CheckAccess
方法将ClaimsAuthorizationManager子类化为实现授权规则。