2012-04-20 17 views
5

Tengo construir un servidor de autorización OAuth2.0 utilizando dotnetopenauth que administrará la autenticación, autorización y asignará accessToken a la persona que llama. La persona que llama usará el token de acceso para acceder a la API (servicios web) en el servidor de recursos. Si sigue el ejemplo proporcionado por dotnetopenauth de recursos del servidor, api que construida utilizando WCF puede ser autenticada por OAuthAuthorizationManager¿Cómo construir una API segura utilizando ServiceStack como servidor de recursos con OAuth2.0?

Si se utiliza ServiceStack para construir mi api de recursos del servidor, cómo construir el proceso de autenticación que verifique la solicitud de API entrante basándose ¿en el token de acceso OAuth2.0 asignado? La funcionalidad debería ser similar a OAuthAuthorizationManager en la muestra dotnetopenid y no en función de la sesión de inicio de sesión.

Respuesta

4

Sólo un poco de actualización

no hice uso de la AuthenticateAttribute o RequiredRoleAttribute de ServiceStack.ServiceInterface.

Creo 2 personalizados RequestFilterAttribute para reemplazar las funciones provistas por AuthenticateAttribute y RequiredRoleAttribute.

En cada método personalizado de RequestFilterAttributeExecute, estoy usando el método en dotnetopenauth para verificar el token de acceso.

//httpReq==req from Execute(IHttpRequest req, IHttpResponse res, object requestDto) 

El código de acceso para la verificación de token como siguiente, la referencia de la documentación pertinente, tanto servicestack y dotnetopenauth para obtener más información. ResourceServer es la clase de dotnetopenauth

HttpRequestBase reqBase = new HttpRequestWrapper((System.Web.HttpRequest)httpReq.OriginalRequest); 

var resourceServer = new ResourceServer(new StandardAccessTokenAnalyzer(AuthorizationServerPublicKey, ResourceServerPrivateKey)); 

IPrincipal ip = null; 
resourceServer.VerifyAccess(reqBase, out ip); 

Si el ip es null entonces no autenticado, si no null, la solicitud entrante es válida y se puede utilizar el ip para comprobar el papel, por ejemplo, ip.IsInRole(requiredRole)

no estoy seguro de que esta es la forma correcta de hacer la comprobación o no, pero es que funciona para mí. Cualquier mejor solución es bienvenida.

Cuestiones relacionadas