Wie verwenden Sie AuthorizationFilterAttribute in WebApi mit WebClient Bibliothek?
Ich verwende den folgenden code für die Autorisierung (ich fand es im internet und ändern Sie es für meinen Gebrauch)
wenn ich rufe meine url scheint Autorisierung funktioniert
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
public class ClientAuthorizationAttribute : AuthorizationFilterAttribute
{
private bool _active = true;
public ClientAuthorizationAttribute()
{
}
public ClientAuthorizationAttribute(bool active)
{
_active = active;
}
public override void OnAuthorization(HttpActionContext actionContext)
{
if (_active)
{
var identity = ParseAuthorizationHeader(actionContext);
if (identity == null)
{
Challenge(actionContext);
return;
}
if (!OnAuthorizeUser(identity.Name, identity.Password, actionContext))
{
Challenge(actionContext);
return;
}
var principal = new GenericPrincipal(identity, null);
Thread.CurrentPrincipal = principal;
base.OnAuthorization(actionContext);
}
}
protected virtual bool OnAuthorizeUser(string clientId, string authId, HttpActionContext actionContext)
{
return false;
}
protected virtual ClientAuthenticationIdentity ParseAuthorizationHeader(HttpActionContext actionContext)
{
string authHeader = null;
var auth = actionContext.Request.Headers.Authorization;
if (auth != null && auth.Scheme == "Basic")
authHeader = auth.Parameter;
if (string.IsNullOrEmpty(authHeader))
return null;
authHeader = Encoding.UTF8.GetString(Convert.FromBase64String(authHeader));
var tokens = authHeader.Split(':');
if (tokens.Length < 2)
return null;
return new ClientAuthenticationIdentity(tokens[0], tokens[1]);
}
void Challenge(HttpActionContext actionContext)
{
var host = actionContext.Request.RequestUri.DnsSafeHost;
actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized);
actionContext.Response.Headers.Add("WWW-Authenticate", string.Format("Basic realm=\"{0}\"", host));
}
}
public class ClientAuthenticationIdentity : GenericIdentity
{
public ClientAuthenticationIdentity(string name, string password)
: base(name, "Basic")
{
Password = password;
}
public string Password { get; set; }
}
public class BasicAuthorizationAttribute : ClientAuthorizationAttribute
{
public BasicAuthorizationAttribute()
{ }
public BasicAuthorizationAttribute(bool active)
: base(active)
{ }
protected override bool OnAuthorizeUser(string clientId, string authId, HttpActionContext actionContext)
{
var businness = new WebServiceAuthBusiness();
return businness.Count(x => x.ClientID == clientId && x.AuthenticateID == authId) > 0;
}
}
}
Client benutze ich WebClient für Get application data (funktioniert nicht)
[BasicAuthorization]
public IList<Application> Get()
{
using (var client = new WebClient())
{
client.BaseAddress = _baseAddress;
client.Encoding = Encoding.UTF8;
client.UseDefaultCredentials = true; ???
client.Credentials = new NetworkCredential(clientId, authId); ???
var str = client.DownloadString("api/application/get");
return JsonConvert.DeserializeObject<List<Application>>(str);
}
}
Wie kann ich senden Benutzernamen und Passwort mit webClient für AuthorizationFilter ???
InformationsquelleAutor Hamed F | 2014-04-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie beschrieben auf c# Ecke:
Hinzufügen BasicAuthenticationAttribute.cs-Klasse in Ihrer Lösung.
Mit folgenden code
In AuthsController.cs(Entity Framework)
Hinzufügen
In Der WebApiConfig.cs
Hinzufügen
In Deinem controller, erfordert Grundlegende Berechtigung.
Hinzufügen
Bearbeitet Antworten @acostela
Ist es nicht ausreichend ist, fügen Sie entweder config.Filter.Add(new BasicAuthenticationAttribute()); in der global config oder schmücken Sie Ihren controller mit BasicAuthentication Attribut. Warum beide?
Ich habe alle von diesem set aber noch eine Anfrage keine authorization-header kehrt zurück-mit 200, was kann ich eventuell fehlt?
InformationsquelleAutor user8024555
Basic-Authentifizierung erfordert Authorization-header gesetzt werden:
base64-Codierung ist eine Anforderung der BASIC-authentication-Protokoll: ietf.org/rfc/rfc2617.txt die Erlaubnis erhalten, sendet der client die Benutzerkennung und das Passwort, getrennt durch einen einzigen Doppelpunkt (":") Zeichen, in einem base64 - [7] kodierten string in den Anmeldeinformationen.
Wenn Sie haben nicht herausgefunden noch. Base64 macht es so Zeichen, die normalerweise nicht gesendet werden kann über HTTP gesendet werden können durch Codierung in der Basis von Zeichen, die erlaubt sind.
InformationsquelleAutor akava
Sollten Sie in der Lage sein zu senden Benutzernamen und verschlüsselt Passwort als Teil von GET-api-URL.
Ihre AuthorizationFilter-sollte in der Lage sein, zu analysieren, Sie aus
RequestUri
aber natürlich werden Sie nie wollen, zu tun, stattdessen müssen Sie möglicherweise implementierenOAuth Token
Stilaccess token
senden Sie zusammen mit Ihrer API. Grundsätzlich werden Ihre Benutzer-login-panel und POST über https der login-Daten und Sie erhalten ein token, und dann jedes mal, wenn er oder Sie macht Anfrage sendet der access-token zusammen mit, dass die api so:Dieser Zugangs-token könnte, verfallen nach bestimmter Zeit oder rate-Begrenzung.
Finden Sie eine Implementierung hier:
http://www.asp.net/web-api/overview/security/individual-accounts-in-web-api
InformationsquelleAutor sir4ju1