Встроенный способ выполнения базовой аутентификации с помощью службы WCF REST?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Встроенный способ выполнения базовой аутентификации с помощью службы WCF REST?

Сообщение Anonymous »

Я использую базовую аутентификацию в своей службе WCF.
А также использую поставщика членства ASP для аутентификации.

Web.Config: Strong>
Для службы REST:

Тип и режим аутентификации:[/b]
Мой собственный класс для BasicAuthentication перед вызовом любого метода.
Код показан ниже:

Код: Выделить всё

namespace BasicAuth.Service
{
public class BasicAuthenticationInvoker : Attribute, IOperationBehavior, IOperationInvoker
{
#region Private Fields

private IOperationInvoker _invoker;

#endregion Private Fields

#region IOperationBehavior Members

public void ApplyDispatchBehavior(OperationDescription operationDescription,
DispatchOperation dispatchOperation)
{
_invoker = dispatchOperation.Invoker;
dispatchOperation.Invoker = this;
}

public void ApplyClientBehavior(OperationDescription operationDescription,
ClientOperation clientOperation)
{
}

public void AddBindingParameters(OperationDescription operationDescription,
BindingParameterCollection bindingParameters)
{
}

public void Validate(OperationDescription operationDescription)
{
}

#endregion IOperationBehavior Members

#region IOperationInvoker Members

public object Invoke(object instance, object[] inputs, out object[] outputs)
{
System.Diagnostics.Debugger.Break();
if (Authenticate())
return _invoker.Invoke(instance, inputs, out outputs);
else
{
outputs = null;
return null;
}
}

public object[] AllocateInputs()
{
return _invoker.AllocateInputs();
}

public IAsyncResult InvokeBegin(object instance, object[] inputs,
AsyncCallback callback, object state)
{
throw new NotSupportedException();
}

public object InvokeEnd(object instance, out object[] outputs, IAsyncResult result)
{
throw new NotSupportedException();
}

public bool IsSynchronous
{
get
{
return true;
}
}

#endregion IOperationInvoker Members

private bool Authenticate()
{
string[] credentials = GetCredentials(WebOperationContext.Current.IncomingRequest.Headers);

if (credentials != null &&  credentials.Length == 2)
{
var username = credentials[0];
var password = credentials[1];
if (Membership.ValidateUser(username, password))  //if valid user
{
//get the roles of the user
string[] roles = Roles.GetRolesForUser(username);
Thread.CurrentPrincipal = new GenericPrincipal(new GenericIdentity(username), roles);
return true;
}
}
WebOperationContext.Current.OutgoingResponse.Headers["WWW-Authenticate"] = string.Format("Basic realm=\"{0}\"", string.Empty);
WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.Unauthorized;
return false;
}

private string[] GetCredentials(WebHeaderCollection headers)
{
string credentials = WebOperationContext.Current.IncomingRequest.Headers["Authorization"];
if (credentials != null)
credentials = credentials.Trim();

if (!string.IsNullOrEmpty(credentials))
{
try
{
string[] credentialParts = credentials.Split(new[] { ' ' });
if (credentialParts.Length == 2 && credentialParts[0].Equals("basic", StringComparison.OrdinalIgnoreCase))
{
credentials = Encoding.ASCII.GetString(Convert.FromBase64String(credentialParts[1]));
credentialParts = credentials.Split(new[] { ':' });
if (credentialParts.Length == 2)
return credentialParts;
}
}
catch (Exception ex)
{

}
}

return null;
}
}
}
Мой Iservice выглядит следующим образом:

Мой пользовательский класс используется в качестве атрибута в контракте Iservice

Код: Выделить всё

public interface IService1
{
[OperationContract]
[BasicAuthenticationInvoker] //my custom class for authentication
[WebGet(UriTemplate = "GetString?userID={userID}",
ResponseFormat = WebMessageFormat.Json)]
string GetString(string userID);
}
При вызове службы WCF REST с использованием вызова AJAX я добавляю заголовок аутентификации в запрос и аутентифицирую пользователя, используя указанный выше пользовательский класс. .

Вызов AJAX:
Ниже приведен вызов Ajax, используемый для вызова службы и используемый перед отправкой для аутентификации пользователя перед доступом к службе. .

Код: Выделить всё

$(function () {
alert("onload");
$.ajax
({
type: "GET",
data:jsondata,
url: https://localhost:446/BasicAuthService.svc/rest/GetString',
cache: false,
async: true,
crossDomain:true,
dataType: "json",
contentType: "application/json; charset=utf-8",
beforeSend: function (xhr) {
xhr.setRequestHeader('Authorization', 'Basic plc2gxMjMk');
},
error: function(jqXHR, exception)
{
alert(jqXHR.status+" "+exception);
}
});
});

Мой вопрос:

Надеюсь, вы получили общее представление о том, как мой код работает.

Итак, мне нужно Вместо использования специального класса для BasicAuthentication, как я могу аутентифицировать каждый запрос к службе?
Есть ли в WCF какие-либо встроенные функции для аутентификации? входящий запрос?

Заранее спасибо.

Подробнее здесь: https://stackoverflow.com/questions/203 ... st-service
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»